某些情况下我们并不需要启用比较重的AR去操作数据库,这里Yii2也为我们提供了
yii\db\Query 查询构造器 只能创建 查询 命令
yii\db\Command sql命令工具 可以创建 curd 操作
两个工具类来满足此类需求,还有个 yii\db\QueryBuilder 感觉用起来有些别扭,感兴趣的自己去看吧
查询构造器可以比较灵活的构建出各种查询命令(不过我觉得灵活是对不太熟悉sql的人来说,因为我比较喜欢写sql,所以我没觉得有多灵活....但Yii2总归还是很不错的)
$query = new \yii\db\Query();
$query->select(['`user`.`id`', '`user`.`username`, `order`.`info`'])
->distinct(false)
->from('{{%_user}} as `user`')
->leftJoin(['order' => '{{%_order}}'], '`order`.`uid` = `user`.`id`')
->where(['or', ['>=', '`user`.`id`', 20], ['<=', '`user`.`id`', 10]])
->andWhere(['not', ['`user`.`username`' => null]])
->orWhere(['>=', 'char_length(`user`.`username`)', 10])
->andFilterWhere(['`user`.`name`' => ''])
->orFilterWhere(['`user`.`name`' => ''])
->groupBy('`user`.`id`')
->addGroupBy('`user`.`username`')
->having(['>', 'count(`user`.`id`)', 0])
->andHaving(['>', 'count(`user`.`username`)', 0])
->orderBy(['`user`.`id`' => SORT_DESC])
->addOrderBy(['`user`.`username`' => SORT_ASC])
->limit(10)
->offset(0);
常用的方法来一坨,更多的大家去看手册就好,这里需要提及的有
distinct 默认为false 我写出来让大家看而已
where / andWhere / orWhere是普通的条件构造方法
andFilterWhere / orFilterWhere 我很喜欢 自动过滤值为空的条件,上面我写的这俩货是不会生成到sql语句中取的,值为空直接被过滤丢弃
其他的 groupBy having 或者 orderBy 的追加方式 addGroupBy andHaving addOrderBy 就可以看出有的查询条件是可以追加成员的,而有的是并行条件的
条件组装完了我们就可以调用 all() one() column() scaler() max() min() average() 什么的去检索结果了了
当然也可以使用 yii\db\Query::createCommand($db=null) 来生成 yii\db\Command 的实例
yii\db\Command 可以直接执行原生的 sql 语句,也可以通过 yii\db\Connection yii\db\Query的实例通过 createCommand 方法来生成自己的一个实例,其自身可以执行 curd 操作,我们可以通过原生的 sql 去生成查询器,也可以通过他自身的方法去构建,最后使用 queryAll() queryOne() queryScaler() 等方法可以进行检索,execute()方法用来执行没有返回结果的命令
//当前数据库连接
$db = Yii::$app->db;
//生成命令查询器 这里其实可以直接根据 sql 进行构造
$command = $db->createCommand();
//单条插入
$command->insert('{{%_user}}', [
'username' => 'sallency',
'password' => '123456',
'auth_key' => md5('123456'),
'access_token' => md5('123456')
]);
$result_insert = $command->execute();
//批量插入
$command->batchInsert('{{%_user}}', ['username', 'password', 'auth_key', 'access_token'], [
['james', 'james@yii', md5('james@yii'), md5('james@yii')],
['jack', 'jack@yii', md5('jack@yii'), md5('jack@yii')],
['lucy', 'lucy@yii', md5('lucy@yii'), md5('lucy@yii')],
['lily', 'lily@yii', md5('lily@yii'), md5('lily@yii')]
]);
$result_batch_insert = $command->execute();
//清空表
$command->truncateTable('{{%_order}}');
$command->execute();
$command->batchInsert('{{%_order}}', ['uid', 'info'], [
[1, 'apple 25g'],
[2, 'orange 25g'],
[3, 'banana 25g'],
[3, 'pear 25g'],
[4, 'orange 25g'],
[4, 'apple 25g'],
[5, 'banana 25g'],
[5, 'orange 25g'],
[1, 'banana 25g'],
]);
$command->execute();
同时 yii\db\Command还可以通过 query命令生成一个yii\db\DataReader实例,然后调用 read(),readAll() ,readColumn()来进行数据读取
$dataReader = $command->query();
//$result = $dataReader->read();
//$result = $dataReader->readAll();
//这里的 readColumn 可以设置读第几列哟
$result = $dataReader->readColumn(2);
学会这两个工具类就足够我们应对偏原生的sql了,那个QueryBulider就不说了,偏内部调用,不是面向开发者的工具类