QeePHP查询对象QDB_Table_Select详解

blogdaren 2015-01-06 抢沙发 1359人次
查询对象 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_id

where(
    array('user_id' => $user_id, 'level_ix' => 1)
)
// table.user_id = $user_id AND table.level_ix = 1

where(
    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)

版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:QeePHP查询对象QDB_Table_Select详解

发表评论:

您的昵称:
电子邮件:
个人主页: