程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 有關數據檢索的更多內容

有關數據檢索的更多內容

編輯:PHP綜合

有關數據檢索的更多內容

我們已經知道使用模型內置方法find()對數據庫表進行數據檢索的基本方法。find()方法的確非常強大,而且我們可以使用它來完成復雜的查詢。我們將會學習更多有關find()方法的內容,了解如何通過它來執行復雜的查詢。我們也將學習如何使用CakePHP提供的其他數據檢索技巧。


有關find()方法的更多內容

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可以設成下面這三種類型中的一個

  • all:find方法會按照給定的排序方式和個數限制返回所有符合條件的記錄。
  • first:這個方法只返回符合約束條件的首條記錄
  • count:會返回查詢結果中所包含記錄的總數量。

正如我們從上一個例子中所看到那樣,我們可以以關聯數組(associative array)的形式在第二個參數 $constraints中指定其他查詢約束。$constraints參數的關聯數組可以有如下鍵(key)

  • conditions(條件):條件(conditions)可應用於取代查詢語句中的WHERE子句。默認值是1=1,這表示沒條件約束。
  • fIElds(字段):查詢結果應該返回的字段范圍。如果沒有指明,它會返回所有字段。當find()函數的第一個參數$type被設置成count時,該參數不可用。
  • order(排序):這個字符串定義了查詢語句中ORDER BY子句的內容。如果order排序沒有指明,那麼SQL查詢中將不會添加有ORDER BY子句。查詢類型是count是,該參數也不可用。
  • limit(限制):該整數指明了返回記錄的最大數量。如果沒指定limit,那麼函數會返回所有符合條件的記錄。只有當查詢類型是all時,它才可用。
  • offset(偏移值):這個參數定義了首個返回記錄的偏移值。默認值是0.只有當type參數是all時,該設置才有效。

為了便於讀者更清楚地了解這個概念,我們將會快速浏覽下面這些表明了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()來完成一些復雜的事情。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved