我們已經知道使用模型內置方法find()對數據庫表進行數據檢索的基本方法。find()方法的確非常強大,而且我們可以使用它來完成復雜的查詢。我們將會學習更多有關find()方法的內容,了解如何通過它來執行復雜的查詢。我們也將學習如何使用CakePHP提供的其他數據檢索技巧。
find() 方法非常靈活,它可以實現SQL語言中SELECT查詢語句所能實現的所有結果。比如,我們只檢索書名以字母“A"開頭並按照ISBN書號降序排列的前兩本書的書號字段和作者名字字段,我們曾需要寫出下面這個SQL查詢語句:
SELECT `Book`.`isbn`, `Book`.`title`, `Book`.`author_name`
FROM `books` AS `Book`
WHERE `Book`.`title` LIKE 'A%'
ORDER BY `Book`.`isbn` DESC
LIMIT 2;
在CakePHP中,我們可以通過像下面這樣使用find()方法來得到同樣的結果。
find(
'all',
array(
'conditions' => array('Book.title' => 'LIKE A%'),
'fields' => array(
'Book.isbn',
'Book.title',
'Book.author_name'
),
'order' => 'Book.isbn DESC',
'limit'=>2
)
);
在條件(condition)中,為字段添加上模型名稱前綴(像寫成Book.title而非title)是一個很好的習慣。當我們需要調取相關模型中的數據並且結果中有相同的字段名稱時,這個習慣就尤其重要。另外它也改善了代碼的清新度
]find()方法接受兩個參數:$type(類型)和$constraints(約束)。$type(類型)是一個用來定義查詢“類型”的字符串。$type可以設成下面這三種類型中的一個
正如我們從上一個例子中所看到那樣,我們可以以關聯數組(associative array)的形式在第二個參數 $constraints中指定其他查詢約束。$constraints參數的關聯數組可以有如下鍵(key)
為了便於讀者更清楚地了解這個概念,我們將會快速浏覽下面這些表明了find()用法的例子:
1,如果你想知道書名以字母“A”開頭的書的數目,我們會在BooksController(Books控制器中)添加如下代碼:
$count = $this->Book->find('count', array('conditions' =>
array('Book.title' => 'LIKE A%'));
It executes the following SQL query:
它會執行如下SQL查詢
SELECT COUNT(*) AS `count` FROM `books` AS `Book` WHERE
`Book`.`title` LIKE 'A%';
當find()方法的$type參數設置成count時,查詢返回的結果是一個整數。在這個例子中, $count變量的值可能是2.
2,如果我們想查詢id最大書本所對應的書號(ISBN)和書名,我們會使用下面這個代碼
$book = $this->Book->find('first',
array(
'fields' => array('isbn', 'title'),
'order' => 'Book.id DESC'
)
);
該代碼會執行如下SQL語句
SELECT `Book`.`isbn`, `Book`.`title` FROM `books` AS `Book`
WHERE 1 = 1 ORDER BY `Book`.`created` DESC LIMIT 1;
儲存在$book變量中的結果會是下面這個樣子:
Array
(
[Book] => Array
(
[isbn] => 1847192971
[title] => Building Powerful and Robust Websites
with Drupal 6
)
)
3,如果你想找出某個作者所寫的所得書並按照書名來排序,那麼下面這個代碼可以達到此目的:
$books = $this->Book->find('all',
array(
'fields' => array('title'),
'conditions' => array(
'Book.author_name' => 'LIKE David Barnes'
),
'order' => 'Book.title ASC'
)
);
上面這段代碼將會執行下面這個SQL查詢
SELECT `Book`.`title` FROM `books` AS `Book` WHERE `Book`.`author_
name` LIKE 'David Barnes' ORDER BY
`Book`.`title` ASC
上面這段查詢會返回如下的結果:
Array
(
[0] => Array
(
[Book] => Array
(
[title] => How to write computer books
)
)
[1] => Array
(
[Book] => Array
(
[title] => How not to write a technical book!
請注意,find()方法的$type參數分別被設置成 first和all時,返回的結果會有所區別。當它被設置成first時,返回的數組是一個關聯數組,其中包含有書的信息。當類型參數被設置成all時, 返回的是一個關聯數組的數組,每個關聯數組內包含有一本書的相關信息
]在上面這些例子中,我們學習了find()方法中使用的一些非常簡單的條件限制。在實際的應用程序中,查詢所用的條件要復雜的多,可能會帶有許多嵌套條件以及各種類型的邏輯和條件運算符。我們接下來將會關注$constraints參數中的condition鍵,並學習如何使用find()來完成一些復雜的事情。