yii2使用原生语句执行数据库操作yii\db\Query和yii\db\Command

别说谁变了你拦得住时间么 提交于 2019-12-07 20:39:46

某些情况下我们并不需要启用比较重的AR去操作数据库,这里Yii2也为我们提供了

yii\db\Query            查询构造器 只能创建 查询 命令

yii\db\Command     sql命令工具 可以创建 curd 操作

两个工具类来满足此类需求,还有个 yii\db\QueryBuilder 感觉用起来有些别扭,感兴趣的自己去看吧

yii\db\Query

查询构造器可以比较灵活的构建出各种查询命令(不过我觉得灵活是对不太熟悉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

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就不说了,偏内部调用,不是面向开发者的工具类

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!