CakePHP Framework: Thao tác trên cơ sở dữ liệu... Ở bài trước, chúng ta đã có dịp đề cập về thao tác cài đặt và tìm hiểu các quy tắc cơ bản trong CakePHP Framework.. Trong bài này, chúng
Trang 1CakePHP Framework: Thao tác trên cơ sở dữ liệu
Trang 2Ở bài trước, chúng ta đã có dịp đề cập về thao tác cài đặt và tìm hiểu các quy
tắc cơ bản trong CakePHP Framework Trong bài này, chúng tôi tiếp tục
hưỡng dẫn các bạn thao tác với mô hình cơ sở dữ liệu Từ đó, chúng ta có thể tiến tới viết ứng dụng thực tế trên nền CakePHP Framework
Để dễ dàng cho việc tương tác với cơ sở dữ liệu (CSDL) Trước tiên chúng ta cần cấu hình theo đường dẫn app/config/database.php thông tin kết nối vào
hệ thống (Xem lại bài CakePHP Framework cho người mới bắt đầu)
Sau khi đã kết nối vào hệ thống, tiếp đến ta tiến hành thực hiện các câu truy vấn sau để tiến hành tạo bảng dữ liệu mẫu, để phục vụ cho những đoạn code test bên dưới
01 CREATE TABLE books (
02 id int(11) NOT NULL AUTO_INCREMENT,
03
isbn varchar(13) NOT
NULL,
04 title varchar(64) NOT NULL,
05 description text NOT NULL,
Trang 306 PRIMARY KEY (id)
07 )
08
09 INSERT INTO `books` VALUES ('1', 'abc', 'Kĩ thuật lập trình', 'abc');
10 INSERT INTO `books` VALUES ('2', 'c,c++', 'Lập trình C', 'lap trinh c');
11
INSERT INTO `books` VALUES ('3', 'C++', 'Cấu trúc dữ liệu và giả thuật', 'abc');
12
INSERT INTO `books` VALUES ('4', 'php', 'PHP căn bản', 'php, lap trinh php');
13
INSERT INTO `books` VALUES ('5', 'php nc', 'PHP Nâng cao', 'php,php nang cao');
14
INSERT INTO `books` VALUES ('6', 'php fw', 'PHP Framework', 'php, php framework');
Tiếp tục, trong thư mục app/models ta tiếp tục tạo file tên book.php với nội dung sau:
1 <?php
2 class Book extends AppModel{
Trang 43 var $name = "Book"; // tên cua Model Book
4 }
Có thể hiểu ý nghĩa của những đoạn code trên như sau:
- Tên file và class Model được đặt ở dạng số ít
- Tên Model đặt giống với tên table tương ứng nhưng ở dạng số ít
- VD tôi có table users
Tên file Model dùng cho table users là :§ user.php
Tên class là : User§
- Như trong ví dụ này tôi có table books thì
Tên file Model dùng cho table books là :§ book.php
Tên class là : Book§
Kế tới trong thư mục app/controllers/ ta tạo file books_controller.php với nội dung sau:
1
<?php class BooksController extends
AppController{
2 var $name = "Books"; // tên của Controller Book
3
4 function exam01(){
Trang 55 $data = $this->Book->find("all");
6 $this->set("data",$data);
7 }
8
9 }
Trang 6- Hàm : $this->Book->find("all") Gọi Model Book , Model Book sẽ tự động
lấy tất cả dữ liệu trong table books và trả về kết quả dạng mãng như sau:
- Hàm : $this->set("data",$data) gán giá trị vào biến $data để hiển thị tương
ứng
Trong thư mục app/view/tạo file thư mục books tương ứng với Controller
Trang 7Bookstrên
Trong thư mục books, tạo fileexam01.cpt:
01 <html>
02 <body>
03 <?php
04 if($data==NULL){
05 echo "<h2>Dada Empty</h2>";
06 }
07 else{
08 echo "<table>
09 <tr>
10 <td>id</td>
11 <td>Title</td>
12 </tr>";
13 foreach($data as $item){
14 echo "<tr>";
15 echo "<td>".$item['Book']['id']."</td>";
Trang 816
echo "<td><a href='books/view/".$item['Book']['id']."'
>".$item['Book']['title']."</a></td>";
17 echo "</tr>";
18 }
19 }
20 ?>
21 </body>
22 </html>
Sau khi đã hoàn tất các công đoạn trên Chạy thử kết quả theo đường dẫn sau
ta sẽ có:
http://localhost/cakephp/books/exam01
Trang 9Truy vấn có điều kiện :
Thêm vào Controller Book với function exam02 :
01 <?php
02 class BooksController extends AppController{
03 var $name = "Books"; // tên của Controller Book
04
05 function exam01(){
06 $data = $this->Book->find("all");
07 $this->set("data",$data);
08 }
09
10 function exam02(){
11 $sql = array(
12 "conditions"=> array(
13 "title LIKE"=> "PHP%",
14 ),
15 “limit” =>
Trang 10“0,2”
16 );
17 $data = $this->Book->find("all",$sql);
18 $this->set("data",$data);
19 }
20
21 }
-Tham số“conditions”ơ đây ý nói điều kiện lọc Ở đây tôi lọc “những title chuỗi bắt đầu là PHP và phía sau là gì cũng được”
- Bạn có thể thêm điều kiệu lọc như “lấy tất cả ngoại trừ id có giá trị là 4”
- Vậy Controller Books bây giờ là :
01 <?php
02 class BooksController extends AppController{
03 var $name = "Books"; // tên của Controller Book
04
05 function exam01(){
06 $data = $this->Book->find("all");
Trang 1107 $this->set("data",$data);
08 }
09
10 function exam02(){
11 $sql = array(
12 "conditions"=> array(
13 "title LIKE"=> "PHP%",
14 “id !=” => 4,
15 ),
16 “limit” => “0,2”
17 ); $data = $this->Book->find("all",$sql);
18 $this->set("data",$data);
19 }
20
21 }
Trong app/views/booksTạo file exam02.ctp:
01 <html>
Trang 1202 <body>
03 <?php
04 if($data==NULL){
05 echo "<h2>Dada Empty</h2>";
06 }
07 else{
08 echo "<table>
09 <tr>
10 <td>id</td>
11 <td>Title</td>
12 </tr>";
13 foreach($data as $item){
14 echo "<tr>";
15 echo "<td>".$item['Book']['id']."</td>";
16 echo "<td>".$item['Book']['title']."</td>";
17 echo "</tr>";
Trang 1318 }
19 }
20 ?>
21 </body>
22 </html>
Chạy kiểm tra thử :http://localhost/cakephp/books/exam02
Truy vấn theo cách bình thường:
- Bình thường ở đây là ta viết 1 câu truy vấn hoàn chỉnh và thực thi nó, không dùng các hàm
Hổ trợ sẵn của CakePHP , bởi đôi lúc ta cần thực thi những câu truy vấn dài
và phức tạp mà lại không nhớ cách viết của CakePHP thì dùng phương pháp này
Trang 14Thêm vào Controller Book function exam03 :
1 <?php
2 function exam03(){
3 $sql = "Select * From books";
4 $data = $this->Book->query($sql);
5 $this->set("data",$data);
6 }
Trong app/views/books/tạo fileexam03.ctp:
01 <html>
02 <body>
03 <?php
04 if($data==NULL){
05 echo "<h2>Dada Empty</h2>";
06 }
07 else{
08 echo "<table>
Trang 1509 <tr>
10 <td>id</td>
11 <td>Title</td>
12 </tr>";
13 foreach($data as $item){
14 echo "<tr>";
15 echo "<td>".$item['books']['id']."</td>";
16 echo "<td>".$item['books']['title']."</td>";
17 echo "</tr>";
18 }
19 }
20 ?>
21 </body>
22 </html>
Trang 16Chạy kiểm tra thử :http://localhost/cakephp/books/exam03
Vậy qua bài này ta cần lưu ý các điểm sau :
- Tên table đặt dạng số nhiều , Model tương ứng cùng tên và ở dạng số ít Vd : table users -> Moldel User
- Các hàm truy vấn CSDL :
+ $this->Book->find("all");
+ $this->Book->find("all",dieu_kien);
+ $this->Book->query(cau_truy_van_sql);
+ $this->Book->getNumRows();