Trang

Thứ Năm, 18 tháng 7, 2013

Tương tác cơ sở dữ liệu với Zend_Db [Zend Framework]

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:
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 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

1 nhận xét: