文档章节

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

big_cat
 big_cat
发布于 2016/05/13 16:00
字数 862
阅读 1384
收藏 1

某些情况下我们并不需要启用比较重的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就不说了,偏内部调用,不是面向开发者的工具类

© 著作权归作者所有

big_cat
粉丝 49
博文 237
码字总数 162865
作品 0
长宁
后端工程师
私信 提问
yii2 new Expression

yii2 new Expression,new Expression,new yiidbExpression,yii2 FINDINSET,yii sql,yiidbExpression 演示一段yii2 关于 new Expression 或者 new yiidbExpression 的sql语句 首先 use yiidbE......

dragon_tech
07/17
35
0
YII访问数据库(Yii Dao)

CDbConnection: 一个抽象数据库连接 CDbCommand: SQL statement CDbDataReader: 匹配结果集的一行记录 CDbTransaction:数据库事务 访问数据库前需要建立数据库连接;使用DAO建立一个抽象数据...

rooney
2014/08/15
244
0
YII2.0 AcriveRecord的简单使用

这篇文章我们来看看在 Yii2 之中的 Active Record,为啥要将 Active Record 单独出来说呢?因为个人认为这是 Yii(不管是 Yii1.1 还是 Yii2)最强大的一部分功能之一,何况又遇上在 Yii2 中其...

bieru
2015/05/10
0
0
Yii2中关于组件的注册以及创建的方法详解

了解yii组件注册与创建的过程,并发现原来yii组件注册之后并不是马上就去创建的,而是待到实际需要使用某个组件的时候再去创建对应的组件实例的。本文大概记录一下这个探索的过程。   要了...

botkenni
2018/06/08
109
0
Yii createCommand CURD操作

本文用作工作记录,也许有人会问为什么不用 Yii 的 Model 去操作 DB,原因很简单,Yii 的 Model 写法上是方便了很多,但是会执行多余的 SQL,打开 Yii 的执行 log 就会发现。所以为了效率,为...

drewin
2015/05/28
3.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

新架构、新角色:TiDB Community Upgrade!

作者:Jian Zhang 经过几年的发展,TiDB 社区已经逐渐成熟,但是随着社区的发展壮大,我们逐渐感受到了现在社区架构上的一些不足。经过一系列的思考和总结,我们决定升级和调整目前社区组织架...

TiDB
29分钟前
5
0
jquery qrcode库提示not function

jquery qrcode 这个库能用,但是必须在初始化的时候,官方给的使用方法是 引入qrcode的库文件后,在js中写以下 html <div id="qrcode"></div> js jQuery('#qrcode').qrcode({ render: ......

shikamaru
33分钟前
13
0
MySQL数据库去重的简单方案

利用 distinct 对需要处理的字段进行去重 select distinct 字段名 from 表名 利用group by select * from 表名 group by 字段名 利用having select * from 表名 group by 字段名 having 字段...

FeanLau
36分钟前
9
0
字符串转换成整数

实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时,则将该...

蔚蓝_晴天
47分钟前
8
0
Eureka客户端续约及服务端过期租约清理源码解析

在之前的文章:EurekaClient自动装配及启动流程解析中,我们提到了在构造DiscoveryClient时除了包含注册流程之外,还调度了一个心跳线程: scheduler.schedule( new Ti...

Java学习录
58分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部