yii 查询构建器
2016-04-10 21:17
786 查看
查询构建器建立在 Database Access Objects 基础之上,可让你创建 程序化的、DBMS无关的SQL语句。
使用Query时,也代表子查询,非常强悍的非常方便。
– 建议忘记字符串的方式
– 可以调用 yii\db\Query::params() 或者 yii\db\Query::addParams() 方法进行动态变量的绑定。
– 数组格式,应该是严格的哈希格式,并且所有条件为and连接,所有都是等值判断。
– 传入Query对象时,也代表子查询。
– 使用 yii\db\Query::andWhere() 或者 yii\db\Query::orWhere() 在原有条件的基础上 附加额外的条件。
– 可以使用可以使用 yii\db\Query::filterWhere() 来过滤空值,这样就不想要这么多if case语句。提示:当一个值为 null、空数组、空字符串或者一个只包含空白字符时,那么它将被判定为空值。
这里涉及一个问题,前端页面的排序条件怎么直接反应给后台,而不用写太多代码呢?答案好像只能手写代码。哈哈…
提供下面三个便利函数简化参数:
使用join有一个问题后面需要好好理一理,avtiveRecord对象里面有hasOne和hasMany这两个函数,用于关联查询,啥情况下用他们啥时候自己写join 的 SQL语句呢?
yii\db\Query 提供了一整套的用于不同查询目的的方法。
在调用 yii\db\Query::all() 之前使用 yii\db\Query::indexBy() ,可使用一个特定的字段或者表达式的值来作为索引结果集数组。
如需使用表达式的值做为索引,那么只需要传递一个匿名函数给 yii\db\Query::indexBy() 方法即可
yii\db\Query::select()
用来指定 SQL 语句当中的 SELECT 子句,入参是一个数组或者字符串,如果使用数组格式来指定字段,你可以使用数组的键值来表示字段的别名。默认是所有字段。很明显,使用数组是最好的方式,不妨让整个项目组都规定使用数组来指定字段,即使只有一个字段。数组名称最好还是selects。–支持子查询,往数组传Query对象即可。–使用yii\db\Query::distinct()函数来添加distinct关键字。–不过不知道怎么最佳hint关键字?–可使用调用yii\db\Query::addSelect()方法来选取附加字段,不过不建议这么麻烦,不如直接修改selects数组的方式。yii\db\Query::from()
yii\db\Query::from() 方法指定了 SQL 语句当中的 FROM 子句,可以通过字符串或者数组的形式来定义被查询的表名称。跟select()函数一样,建议使用数组的方式来统一开发。使用Query时,也代表子查询,非常强悍的非常方便。
yii\db\Query::where()
还是跟上面一样,不过加多一种叫做操作符数组的东西。eg:字符串格式,例如:'status=1' 哈希格式,例如: ['status' => 1, 'type' => 2] 操作符格式,例如:['like', 'name', 'test']
– 建议忘记字符串的方式
– 可以调用 yii\db\Query::params() 或者 yii\db\Query::addParams() 方法进行动态变量的绑定。
– 数组格式,应该是严格的哈希格式,并且所有条件为and连接,所有都是等值判断。
– 传入Query对象时,也代表子查询。
– 使用 yii\db\Query::andWhere() 或者 yii\db\Query::orWhere() 在原有条件的基础上 附加额外的条件。
– 可以使用可以使用 yii\db\Query::filterWhere() 来过滤空值,这样就不想要这么多if case语句。提示:当一个值为 null、空数组、空字符串或者一个只包含空白字符时,那么它将被判定为空值。
yii\db\Query::orderBy()
yii\db\Query::orderBy() 方法是用来指定 SQL 语句当中的 ORDER BY 子句的,参数形式跟上面一致,还是建议数组的方式。这里涉及一个问题,前端页面的排序条件怎么直接反应给后台,而不用写太多代码呢?答案好像只能手写代码。哈哈…
yii\db\Query::groupBy()
yii\db\Query::having()
yii\db\Query::limit() 和 yii\db\Query::offset()
yii\db\Query::join()
yii\db\Query::join() 带有四个参数:$type: 连接类型,例如:'INNER JOIN', 'LEFT JOIN'。 $table: 将要连接的表名称。 $on: 可选参数,连接条件,即 ON 子句。请查阅 where() 获取更多有关于条件定义的细节。 $params: 可选参数,与连接条件绑定的参数。
提供下面三个便利函数简化参数:
yii\db\Query::innerJoin() yii\db\Query::leftJoin() yii\db\Query::rightJoin()
使用join有一个问题后面需要好好理一理,avtiveRecord对象里面有hasOne和hasMany这两个函数,用于关联查询,啥情况下用他们啥时候自己写join 的 SQL语句呢?
yii\db\Query::union()
endyii\db\Query 提供了一整套的用于不同查询目的的方法。
yii\db\Query::all(): 将返回一个由行组成的数组,每一行是一个由名称和值构成的关联数组(译者注:省略键的数组称为索引数组)。 yii\db\Query::one(): 返回结果集的第一行。 yii\db\Query::column(): 返回结果集的第一列。 yii\db\Query::scalar(): 返回结果集的第一行第一列的标量值。 yii\db\Query::exists(): 返回一个表示该查询是否包结果集的值。 yii\db\Query::count(): 返回 COUNT 查询的结果。 其它集合查询方法: 包括 yii\db\Query::sum(), yii\db\Query::average(), yii\db\Query::max(), yii\db\Query::min() 等. $q 是一个必选参数, 既可以是一个字段名称,又可以是一个 DB 表达式。
索引查询结果
非常有用的工能。在调用 yii\db\Query::all() 之前使用 yii\db\Query::indexBy() ,可使用一个特定的字段或者表达式的值来作为索引结果集数组。
如需使用表达式的值做为索引,那么只需要传递一个匿名函数给 yii\db\Query::indexBy() 方法即可
批处理查询
当需要处理大数据的时候,像 yii\db\Query::all() 这样的方法就不太合适了, 因为它们会把所有数据都读取到内存上。为了保持较低的内存需求, Yii 提供了一个 所谓的批处理查询的支持。批处理查询会利用数据游标将数据以批为单位取出来。在数据系统里面,要生成很大的Excel文件的时候就可以采用这个方法。相关文章推荐
- YII Framework框架教程之安全方案详解
- Yii PHP Framework实用入门教程(详细介绍)
- PHP的Yii框架中Model模型的学习教程
- 详解PHP的Yii框架中自带的前端资源包的使用
- Yii操作数据库的3种方法
- 在yii中新增一个用户验证的方法详解
- 详解PHP的Yii框架中的Controller控制器
- PHP的Yii框架中过滤器相关的使用总结
- Yii框架在页面输出执行sql语句以方便调试的实现方法
- YII动态模型(动态表名)支持分析
- 浅析Yii中使用RBAC的完全指南(用户角色权限控制)
- 详解在PHP的Yii框架中使用行为Behaviors的方法
- Yii 连接、修改 MySQL 数据库及phpunit 测试连接
- 深入讲解PHP的Yii框架中的属性(Property)
- yii实现使用CUploadedFile上传文件的方法
- 实例讲解如何在PHP的Yii框架中进行错误和异常处理
- 解读PHP的Yii框架中请求与响应的处理流程
- 详解PHP的Yii框架中组件行为的属性注入和方法注入
- YII Framework学习之request与response用法(基于CHttpRequest响应)
- Yii中CArrayDataProvider和CActiveDataProvider区别实例分析