查询对象 QDB_Table_Select

查询对象用于从数据库查询符合条件的记录,并返回为数组或者 ActiveRecord 对象实例。

查询对象使用方法链来构造灵活的查询表达式,例如:

$table = new QDB_Table(...);$rowset = $table->find(...)->all(...)->order(...)->query();

查询对象的主要方法?

指定查询行为:

  • select() 指定 SELECT 子句后要查询的内容(字段、表达式)
  • where() 添加查询条件
  • order() 指定查询的排序
  • all() 指示查询所有符合条件的记录
  • limit() 限制查询结果总数
  • limitPage() 设置分页查询
  • getPageInfo() 获得查询后的分页信息
  • group() 指定 GROUP BY 子句
  • having() 指定 HAVING 子句的条件
  • forUpdate() 是否构造一个 FOR UPDATE 查询
  • distinct() 是否构造一个 DISTINCT 查询

ActiveRecord 相关:

  • asObject() 指示将返回的记录封装为特定的 ActiveRecord 对象

统计功能:

  • count() 统计符合条件的记录数
  • avg() 统计平均值
  • max() 统计最大值
  • min() 统计最小值
  • sum() 统计合计

执行:

  • query() 执行查询,并返回结果

辅助方法:

  • toString() 返回完整的 SQL 语句

对复杂查询条件的支持?

where() 支持的查询条件模式包括:

  • 模式1:where(字符串, [查询参数1, 查询参数2, ...])
  • 模式2:where(数组, [查询参数1, 查询参数2, ...])

where() 的两种解析模式?

如果第一个参数是字符串,则按照基本模式1进行解析; 如果第一个参数是数组,则按照模式2解析。

模式1的解析规则?

查询条件中字段名的解析:?

  • 如果直接书写字段名,则不会进行任何处理
  • 如果用“[ ]”(方括号)符号包括字段名,则该字段名会被提取出来进行转义处理
  • 对于提取出来的字段名,还会解析是否包含表名称或关联名称
  • 如果字段名包含关联名称,则字段名会转义为“关联表的表名称.字段名”

例如:

level_ix = 1 AND credits > 1000
[name] = 'php'
[posts.author] = 'dualface' AND [tags.name] = 'php'

会被解析为(假定当前表是 q_members,而 posts 关联和 tags 关联对应的数据表分别是 q_posts 和 q_tags):

level_ix = 1 AND credits > 1000
q_members.name = 'php'
q_posts.author = 'dualface' AND q_tags.name = 'php'

查询条件中参数占位符的解析:?

可以在查询条件中使用两种形式的参数占位符,分别是:

  • ?”(问号)匿名参数
  • :”(冒号)开头的命名参数

例如:

level_ix = ?`name` = :name`post_id` IN (?)`posts.author` = :author AND `tags.name` IN (:tags_name)

注意:不能在查询条件中混用匿名参数和命名参数

查询参数的解析:?

如果查询条件使用匿名参数,那么查询参数则按顺序处理。

例如:

where('level_ix = ? AND credits > ?', $level_ix, $credits)

如果查询条件使用命名参数,则 where() 方法的第二个参数必须是数组,并且以查询参数名为键名。

例如:

where(`posts.author` = :author AND `tags.name` IN :tags_name[]', array('author' => 'dualface','tags_name' => array('php', 'book'),)
)

模式2的解析规则?

  • 数组的每一个元素定义查询条件的一部分
  • 如果元素是一个名值对,则假定为 字段名 对应 查询值
    • 解析字段名是否包含表名称或关联名称
    • 如果字段名包含关联名称,则字段名会转义为“关联表的表名称.字段名”
    • 否则字段名转义为“当前表名称.字段名”
  • 如果元素仅仅包含值,则假定为字符串查询条件
    • 如果直接书写字段名,则不会进行任何处理
    • 如果用“[ ]”(方括号)符号包括字段名,则该字段名会被提取出来进行转义处理
    • 对于提取出来的字段名,还会解析是否包含表名称或关联名称
    • 如果字段名包含关联名称,则字段名会转义为“关联表的表名称.字段名”
    • 会解析字符串查询条件中包含的参数占位符

例如:

where(array('user_id' => $user_id)
)
// table.user_id = $user_idwhere(array('user_id' => $user_id, 'level_ix' => 1)
)
// table.user_id = $user_id AND table.level_ix = 1where(array('(', 'user_id' => $user_id, 'OR', 'level_ix' => $level_ix, ')', 'created > ?')
)
// (table.user_id = $user_id OR table.level_ix) AND created > ?where(array('user_id' => array($id1, $id2, $id3))
)
// table.user_id IN ($id1, $id2, $id3)

qeephp 查询对象 QDB_Table_Select 详解相关推荐

  1. Elasticsearch(es) 查询语句语法详解

    Elasticsearch 查询语句采用基于 RESTful 风格的接口封装成 JSON 格式的对象,称之为 Query DSL.Elasticsearch 查询分类大致分为全文查询.词项查询.复合查 ...

  2. mongodb java查询_java操作mongoDB查询的实例详解

    java操作mongo查询的实例详解 前言: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库 ...

  3. mysql resulttype map_Mybatis中的resultType和resultMap查询操作实例详解

    resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的映射问题.比 ...

  4. 深入mysql慢查询设置的详解

    深入mysql慢查询设置的详解 在web开发中,我们经常会写出一些SQL语句,一条糟糕的SQL语句可能让你的整个程序都非常慢,超过10秒一般用户就会选择关闭网页,如何优化SQL语句将那些运行时间 比较 ...

  5. mysql通过集合查询_MySQL使用集合函数进行查询操作实例详解

    本文实例讲述了MySQL使用集合函数进行查询操作.分享给大家供大家参考,具体如下: COUNT函数 SELECT COUNT(*) AS cust_num from customers; SELECT ...

  6. openerp经典收藏 对象定义详解(转载)

    对象定义详解 原文地址: http://shine-it.net/index.php/topic,2159.0.html http://blog.sina.com.cn/s/blog_57ded94e ...

  7. python的类和对象_Python面向对象之类和对象实例详解

    本文实例讲述了Python面向对象之类和对象.分享给大家供大家参考,具体如下: 类和对象(1) 对象是什么? 对象=属性(静态)+方法(动态): 属性一般是一个个变量:方法是一个个函数: #类的属性 ...

  8. JavaScript中DOM对象的详解

    *** JavaScript中DOM对象的详解*** DOM对象:Document Object Model,文档对象模型.也称为document(文档对象),是HTML页面当前窗体的内容,是连接JS ...

  9. mysql 嵌套查询性能_MySQL数据库之嵌套查询与连接查询的性能详解

    本文主要向大家介绍了MySQL数据库之嵌套查询与连接查询的性能详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 嵌套查询与连接查询的性能:连接查询一般较快:子查询很难被优化. ...

最新文章

  1. [Linux] PHP程序员玩转Linux系列-Linux和Windows安装nginx
  2. 程序员的个人发展注意事项
  3. opencv视频模糊处理
  4. c++中虚函数和纯虚函数定义
  5. 阅读redis源代码的一些体会
  6. openpyxl库,1秒合并多张表格并设置图表格式
  7. 了解ADF生命周期中的ADF绑定
  8. Docker JFrog Artifactory 7.27.10 maven私服(搭建篇)
  9. NodeBlog v0.1.0发布
  10. [BJDCTF2020]Cookie is so stable
  11. GeoServer地图开发解决方案(四):发布Web地图服务(WMS)篇
  12. Integer和int的区别
  13. 跳转定义_HTML中的超级链接和锚点跳转
  14. 关于视觉SLAM中特征点法,光流法和直接法的区别和理解
  15. tukey 窗口_C语言完成窗口算法
  16. Objective-C 程序设计(第4版)
  17. 微信公众平台推广攻略
  18. cad绘制正八边形_CAD怎么画正八边形 看完你学会了么
  19. Android Studio 开发(二)问题
  20. ctr 平滑_ctr平滑

热门文章

  1. QT pro 使用DEFINES来实现条件编译
  2. 视频教程-汇编语言程序设计V-其他
  3. 这也太让人大开眼界了,你有没有见过的这样spring boot项目启动图案
  4. 【数位dp】LibreOJ - 10166数字游戏
  5. 【IOS】IOS开发问题解决方法索引(六)
  6. ce查找人物基址,利用CE快速找到游戏内角色基址信息的方法!
  7. android led闪烁功能,详解Android应用层制作LED指示灯
  8. nodejs+vue校园用车辆校车管理系统
  9. 如何用HTML写一个百度浏览器
  10. linux系统日志记录syslog