Bài tiếp theo trong series Cakephp Framework là phần truy vấn CSDL, chúng ta sẽ cùng tìm hiểu về cách sử dụng các câu truy vấn đơn giản, thường xuyên được sử dụng trong cakephp.

Yêu cầu: đã đọc Bài 4 – Tạo một Model – View – Controller.

Phần 1: Tạo một table mới có tên là books và thêm vào một số dữ liệu mẫu để test.

CREATE TABLE books ( id int(11) NOT NULL AUTO_INCREMENT, title varchar(64) NOT NULL, description text NOT NULL, PRIMARY KEY (id) );
INSERT INTO `books` VALUES ('1', 'Truy tìm ký ức', 'Người tình làm nhân');
INSERT INTO `books` VALUES ('2', 'Hoa thiên cốt', 'Ngôn tình abc abc');
INSERT INTO `books` VALUES ('3', 'Tuyết đoạn hồn', 'Truyện ma kinh dị abd');
INSERT INTO `books` VALUES ('4', 'Sủng mị', 'Truyện tiên ma dị giới');
INSERT INTO `books` VALUES ('5', 'Vũ nghịch càn khôn', 'Truyện tiên ma dị giới');
INSERT INTO `books` VALUES ('6', 'Tuyết ưng Linh chủ', 'Truyện tiên ma dị giới');

Cú pháp:

$this->Model->find(string $type = ‘first’, array $params = array());

-find() mặc định muốn truy vấn dữ liệu là phải sử dụng.

-$type bao gồm: 'all', 'first','count', 'list', 'neighbors' or 'threaded', thường xuyên dùng đến gồm all, first, count.(đây là phần chính của bài này)

-$params: là một mảng điều kiện lấy ra dữ liệu được tóm gọn như sau:

array(
 'conditions' = array('Model.field' = $thisValue), //mảng các điều kiện để lấy dữ liệu ra như phần where của câu Select
 'recursive' = 1, //kiểu số là giới hạn số lượng bảng ta lấy dữ liệu
 'fields' = array('Model.field1', 'DISTINCT Model.field2'), //mảng các tên field được lấy ra trong bảng
 'order' = array('Model.created', 'Model.field3 DESC'),//có thể là chuổi hoặc mảng để order by
 'group' = array('Model.field'), //các fields để GROUP BY
 'limit' = n, //kiểu số giới hạn record
 'page' = n, //kiểu số
 'offset' = n, //kiểu số
 'callbacks' = true //ngoài true còn có false, 'before', 'after'
)

Phần 2: Truy vấn không có điều kiện (lấy ra toàn bộ dữ liệu – all)

Tạo ra các file cần thiết:

»Trong thư mục app/Model/, tạo file Book.php với nội dung:

<?php
class Book extends AppModel {
   var $name = "Book";
}

»Trong thư mục app/Controller/, tạo file BooksController.php nội dung là:

<?php
class BooksController extends AppController{
    public $name = "Books";
    function index(){
      $data = $this->Book->find("all");
      /*echo "<pre>";
      print_r($data);
      echo "</pre>";*/
      $this->set("data",$data);
    }
}

Ta có hàm $this->Book->find(“all”) nghĩa là gọi model Book và model này sẽ lấy tất cả dữ liệu trong tables books và trả về kết quả một dạng mảng như sau: xem mảng đó bằng print_r($data)

2015-09-18_100711

 

Ta có thêm $this->set(“data”,$data) là gán giá trị vào biến $data để hiển thị tương ứng ngoài view.

Trong thư mục app/View/, ta tạo thư mục Books tương ứng với Controller Books và tạo file index.ctp trong thư mục Books tương ứng với function index(),

Nội dung file index.ctp như sau:

<!DOCTYPE html>
  <html>
   <head>
   <title>Ví dụ 1</title>
   </head>
   <body>
<?php
if($data==NULL){
echo "<h2>Dada Empty</h2>";
}
else{
echo "<table>
  <tr>
    <td>id</td>
    <td>Title</td>
    <td>Description</td>
  </tr>";
foreach($data as $item){
  echo "<tr>";
   echo "<td>".$item['Book']['id']."</td>";
   echo "<td>".$item['Book']['title']."</td>";
   echo "<td>".$item['Book']['description']."</td>";
  echo "</tr>";
 }
}
?>
   </body>
</html>

»Tiến hành chạy để kiểm tra với url: http://localhost:8080/cakephp/books/index

2015-09-18_103733

Phần 3: Truy vấn có điều kiện: sử dụng $type là all, first và $params có conditions(điều kiện lấy dữ liệu).

»Thêm vào file BooksController.php một hàm mới function index2, nội dung mới của file BooksController.php là:

<?php
class BooksController extends AppController{
   public $name = "Books";
   function index(){
     $data = $this->Book->find("all");
     /*echo "<pre>";
     print_r($data); exit;
     echo "</pre>";*/
     $this->set("data",$data);
   }
   function index2() {
     //có 2 cách viết
     //Cách 1
     /*$conditions = array(
         'conditions' => array('description LIKE' => "truyện tiên ma%" ),
       );

     $data = $this->Book->find("all" , $conditions);
     $this->set("data", $data);*/

     //Cách 2
     $data = $this->Book->find("all", array(
          'conditions' => array('description LIKE' => "truyện tiên ma%" ),
          'limit' => 2,
          //'fields' => array('title', 'description', 'id'),
          //'order' => array('id DESC'),
     ));
     $this->set("data", $data);
    }
 }

Ở trên mình có để 2 cách viết các bạn có thể mở ghi chú ra để chạy thử và xem các kết quả khác nhau, giải thích một chút

  • conditions nó là điều kiện lọc giống như phần where trong câu SQL
  • limit giới hạn số lượng dữ liệu được lấy ra
  • fields chỉ lấy các field được chỉ định
  • order phần này là order by

»Tạo thêm file index2.ctp trong thư mục app/View/Books có nội dung giống file index.ctp

Nếu sử dụng cách 2 trong BooksController.php khi chạy url http://localhost:8080/cakephp/books/index2 , bạn sẽ được kết quả như sau:

2015-09-18_112541

 

⇒Đó là cách lấy ra nhiều record trong một bảng, giả sử bây giờ chỉ muốn lấy một record có id =3 thì chúng ta sẽ sử dụng first thay vì all

»Thêm một function index3() trong file BooksController.php nội dung function này là:

   function index3(){
     $data = $this->Book->find("first", array(
       'conditions' => array('id' => 3),
     ));
     /*echo "<pre>";
     print_r($data);
     echo "</pre>";*/
     $this->set("data" , $data);
}

»Tạo thêm tiếp một file index3.ctp trong thư mục app/View/Books có nội dụng là:

<!DOCTYPE html>
   <html>
    <head>
    <title>Ví dụ 3</title>
    </head>
   <body>
    <?php
     if($data==NULL){
      echo "<h2>Dada Empty</h2>";
     }
     else{
      echo "<table>
       <tr>
       <td>id</td>
       <td>Title</td>
       <td>Description</td>
       </tr>";
       echo "<tr>";
       echo "<td>".$data['Book']['id']."</td>";
       echo "<td>".$data['Book']['title']."</td>";
       echo "<td>".$data['Book']['description']."</td>";
       echo "</tr>";
     }
  ?>
  </body>
</html>

Tiến hành chạy thử sẽ thấy được record thứ 3 được hiển thị là “Tuyết đoạn hồn” url: http://localhost:8080/cakephp/books/index3

Phần 4: Truy vấn theo cách bình thường(viết câu lệnh SQL).

Đối với một số bạn vừa mới làm quen với Cakephp thì với cách viết trên sẽ gặp khó khăn trong việc làm quen hoặc không muốn viết như thế mà muốn viết một cách bình thường của PHP thuần hoặc là một số câu SQL phức tạp bạn không thể viết bằng cách của Cakephp ⇒ Để giải quyết vấn để này Cakephp có hỗ trợ cho chúng ta bằng cách query($sql)

»Thêm vào BooksController.php function index4() có nội dung

function index4(){
   $sql = "Select * From books";
   $data = $this->Book->query($sql);
   $this->set("data" , $data);
}

»Tạo thêm file index4.ctp trong thư mục app/View/Books và nội dung là:

<!DOCTYPE html>
<html>
  <head>
   <title>Ví dụ 4</title>
  </head>
  <body>
  <?php
   if($data==NULL){
     echo "<h2>Dada Empty</h2>";
   }
   else{
     echo "<table>
     <tr>
     <td>id</td>
     <td>Title</td>
     <td>Description</td>
     </tr>";
     foreach($data as $item){
      echo "<tr>";
      echo "<td>".$item['books']['id']."</td>";
      echo "<td>".$item['books']['title']."</td>";
      echo "<td>".$item['books']['description']."</td>";
      echo "</tr>";
     }
  }
?>
  </body>
</html>

Chạy thử http://localhost:8080/cakephp/books/index4, kết quả sẽ được hiển thị như function index()

2015-09-18_103733

Bài này đến đây thôi, các điểm cần lưu ý như sau:

  • $this->Book->find(“all”);//first
  • $this->Book->find(“all”,dieu_kien);//first
  • $this->Book->query(cau_truy_van_sql);
  • Trong file BooksController.php mình có đặt tên là public $name = “Books”; và trong Book.php có đặt tên var $name = “Book”; việc chọn var hay public đều được ở phiên bản PHP từ 5.1.3 trở lên, nếu sử dụng var ở phiên bản PHP trước 5.1.3 sẽ có cảnh báo.
  • Cách đặt tên các class, file thì các bạn xem lại bài [Cakephp] Bài 3 – Cấu trúc thư mục và các quy ước đặt tên

Kết luận

  1. Nếu có thắc mắc gì các bạn để lại comment bên dưới mình sẽ trả lời sớm nhất có thể.
  2. Cảm ơn các bạn đã đọc.

Nongdanit.info
[Cakephp] Bài 5 – Truy vấn CSDL