Chúng ta đã học cách tương tác cơ sở dữ liệu với Zend_Db_Table. Tuy
nhiên, với những câu truy vấn phức tạp, đòi hỏi phải kết nhiều bảng thì
rõ ràng Zend_Db_Table rất khó khăn trong việc thực hiện...
Trong bài này, chúng ta sẽ cùng tìm hiểu thêm phương pháp tương
tác cơ sở dữ liệu với các câu truy vấn tùy ý từ thư viện Zend_Db trong Zend Framework.
Bước 1: Cấu hình kết nối cơ sở dữ liệu
Trong file Bootstrap:
Bước 2: Khởi tạo đối tượng kết nối trong Model
Trong Model: ta viết hàm __construct() để lấy giá trị từ registry để đưa vào thuộc tính tên $db. Để mỗi khi ta khởi tạo đối tượng thì đối tượng kết nối đã được tạo sẵn.
Bước 3: Truy vấn cơ sở dữ liệu
Tại thư mục Models, ta tạo file tên chitiettin.php với nội dung.
Sử dụng Zend_Db sẽ dễ dàng hơn cho chúng ta viết các câu lệnh truy vấn phức tạp vì đơn giản chúng ta quen với cách viết này. Chúng ta chỉ cần chạy các câu truy vấn trong MySQL, nếu thành công thì chỉ việc past vào đây là sử dụng được.
Đồng thời, chúng ta có thể tạo ra những tùy biến kết hợp giữa Zend_Db_Table và Zend_Db. Chẳng hạn, với câu truy vấn đơn giản, ta có thể sử dụng Zend_Db_Table để lấy giá trị. Nhưng với các câu truy vấn phức tạp đòi hỏi phải kết bảng, xử lý nhiều, thì việc dùng cách tương tác Zend_Db lại là sự lựa chọn hiệu quả nhất.
Khi sử dụng Zend_Db, nếu không fetchAll() thì kết quả trả về là một đối tượng Zend_Db_Statement_Pdo Object
Ví dụ:
Nếu chỉ lấy một dòng dữ liệu, ta không thể sử dụng fetchRow() mà ta chỉ cần viết là fetch()
Ví dụ:
Bước 1: Cấu hình kết nối cơ sở dữ liệu
Trong file Bootstrap:
protected function _initDB() { $db = Zend_DB::factory("Pdo_mysql",array( "host"=>"localhost", "username"=>"root", "password"=>"xxxx", "dbname"=>"zend", "charset"=>"utf8" )); $db->setFetchMode(Zend_Db::FETCH_ASSOC); Zend_Db_Table::setDefaultAdapter($db); Zend_Registry::set('db', $db); }Xem thêm về Cấu hình kết nối cơ sở dữ liệu trong Zend Framework
Bước 2: Khởi tạo đối tượng kết nối trong Model
Trong Model: ta viết hàm __construct() để lấy giá trị từ registry để đưa vào thuộc tính tên $db. Để mỗi khi ta khởi tạo đối tượng thì đối tượng kết nối đã được tạo sẵn.
class Default_Model_Chitiettin extends Zend_Db_Table_Abstract { protected $_name="chitiettin"; protected $_primary="idTin"; protected $_db; public function __construct() { $this->_db=Zend_Registry::get('db'); } }
Bước 3: Truy vấn cơ sở dữ liệu
Tại thư mục Models, ta tạo file tên chitiettin.php với nội dung.
class Default_Model_Chitiettin extends Zend_Db_Table_Abstract { protected $_name="chitiettin"; protected $_primary="idTin"; protected $_db; public function __construct() { $this->_db=Zend_Registry::get('db'); } public function listAll() { $se=" SELECT * FROM chitiettin ORDER BY idTin DESC "; $qr= $this->_db->query($se); if($qr) { return $qr->fetchAll(); }else{ return false; } } }
Sử dụng Zend_Db sẽ dễ dàng hơn cho chúng ta viết các câu lệnh truy vấn phức tạp vì đơn giản chúng ta quen với cách viết này. Chúng ta chỉ cần chạy các câu truy vấn trong MySQL, nếu thành công thì chỉ việc past vào đây là sử dụng được.
Đồng thời, chúng ta có thể tạo ra những tùy biến kết hợp giữa Zend_Db_Table và Zend_Db. Chẳng hạn, với câu truy vấn đơn giản, ta có thể sử dụng Zend_Db_Table để lấy giá trị. Nhưng với các câu truy vấn phức tạp đòi hỏi phải kết bảng, xử lý nhiều, thì việc dùng cách tương tác Zend_Db lại là sự lựa chọn hiệu quả nhất.
class Default_Model_Chitiettin extends Zend_Db_Table_Abstract { protected $_name="chitiettin"; protected $_primary="idTin"; protected $_db; public function __construct() { $this->_db=Zend_Registry::get('db'); } public function listAll() { $se=" SELECT * FROM chitiettin ORDER BY idTin DESC "; $qr= $this->_db->query($se); if($qr) { return $qr->fetchAll(); }else{ return false; } } public function listAll2() { $se=$this->select(); $se->order("idTin DESC"); $kq=$this->fetchAll($se); if($kq) { return $kq->toArray(); }else{ return false; } } }
Khi sử dụng Zend_Db, nếu không fetchAll() thì kết quả trả về là một đối tượng Zend_Db_Statement_Pdo Object
Ví dụ:
public function listAll() { $se="SELECT * FROM chitiettin ORDER BY idTin DESC"; $qr=$this->_db->query($se); return $qr; }
Nếu chỉ lấy một dòng dữ liệu, ta không thể sử dụng fetchRow() mà ta chỉ cần viết là fetch()
Ví dụ:
public function listAll()
{
$se="SELECT * FROM chitiettin ORDER BY idTin DESC";
$qr=$this->_db->query($se);
return $qr->fetch();
}
Nguồn: http://www.qhonline.info
bạn ơi, sao mình làm không được!
Trả lờiXóa