QEEPHP---查詢對象QDB_TABLE_SELECT

查詢對象 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)
相關文章
相關標籤/搜索