进行数据库配置
略
使用原生 sql
下一步我们创建 yii\db\Command 对象就可以执行sql语句了
$result = Yii::$app->db->createCommand($sql)->查询方法
常见的’查询方法’都有这些
queryAll、queryOne、queryScalar
示例
如果我们想获取 user 表内所有的数据
$sql = "SELECT * FROM `article`";
$result = Yii::$app->db->createCommand($sql)->queryAll();
同理,queryOne()是获取一条数据,queryScalar是获取一个值
注意事项
1、queryOne方法只返回结果集中的一条数据,实际查询的条件语句中并不会带上limit 1,如果你调用该方法查询数据,但是不能保证返回的结果集只有一条,为了性能考虑,请务必添加limit 1这个条件
2、在一些接收用户提交的参数的where条件上,千万不要像下面这样直接拼接where条件
$id = $_GET['id'];
$sql = "SELECT * FROM `article` WHERE id = '{$id}'";
$result = Yii::$app->db->createCommand($sql)->queryAll();
实际开发中,为了避免sql注入,请一定不要参考上面的写法!绑定参数是一种避免sql注入的友好方式
来看下正确的写法
$result = Yii::$app->db->createCommand('SELECT * FROM `article` WHERE id=:id')
->bindValue(':id', $_GET['id'])
->queryOne();
如果where条件的参数不是来自于用户端,那随便写。
查询构建器(Query Builder)
相对于原生sql,query builder就安全的多了,而且,一旦你的sql很长,query builder构建的sql语句,可读性也会更强
使用方法
实例化\yii\db\Query类,然后调用查询方法即可。
$query = new \yii\db\Query;
$results = $query
->select(['id', 'email'])
->from('user')
->where(['username' => 'aa'])
->limit(5)
->all();
查看具体sql的方法
有两种方式:
1、借助yii-debug的使用,在DB一栏可观察到具体执行的sql语句
2、在上面的基础上,执行下面的sql语句,打印具体的sql语句
$sql = $query->createCommand()->getRawSql();
var_dump($sql);
使用查询构造器不用绑定参数
常见的查询方法, all、one、scalar、count、sum、min、average等等
one方法没有limit 1,在不保证结果集是一条的基础上,请一定要在query上追加limit(1)
示例
假设我们要构建的sql如下
1、SELECT `id`, `email` FROM `user` WHERE `id` IN (1,2,3,4,5,6,7,8)
2、SELECT `id`, `email` FROM `user` WHERE `id` = 1 OR `id` = 2
3、SELECT `id`, `email` FROM `user` WHERE `username` LIKE '%aa%'
4、SELECT `id`, `email` FROM `user` WHERE (`username` LIKE '%aa%') OR (`title` LIKE '%aa%')
5、SELECT `id`, `email` FROM `user` WHERE 1 = 1 AND (`name` = '李四' OR `age` = 21) // 注意小括号的位置,在有些情况下错不得
query构建结果分别如下
$query = new \yii\db\Query;
1、$results = $query
->select(['id', 'email'])
->from('user')
->where(['IN', 'id', [1,2,3,4,5,6,7,8]])
->all();
2、$results = $query
->select(['id', 'email'])
->from('user')
->where(['OR', 'id=1', 'id=2'])
->all();
3、$results = $query
->select(['id', 'email'])
->from('user')
->where(['LIKE', 'username', 'aa'])
->all();
4、$results = $query
->select(['id', 'email'])
->from('user')
->where(['LIKE', 'username', 'aa'])
->orWhere(['LIKE', 'title', 'aa'])
->all();
或者:
$results = $query
->select(['id', 'email'])
->from('user')
->where(['OR', ['LIKE', 'username', 'aa'], ['LIKE', 'title', 'aa']])
->all();
5、$results = $query
->select(['id', 'email'])
->from('user')
->where([1 => 1])
->andWhere(['OR', 'name=李四', 'age=21'])
->all();
下面我们再来看一下连表的操作
SELECT `t`.`id`, `t`.`email`, `t2`.`type`
FROM `user` AS `t`
LEFT JOIN `auth` AS `t2`
ON `t`.`id` = `t2`.`id`
WHERE `t`.`id` = 1
query的实现方式
$query = new \yii\db\Query;
$results = $query
->select(['t.id', 't.email', 't2.type'])
->from(['t' => 'user'])
->leftJoin(['t2' => 'auth', 't.id' => 't2.id'])
->where(['t.id' => 1])
->all();
除此之外,还有很多诸如orderBy、groupBy、having、union等方法