Trang

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

Tương tác cơ sở dữ liệu sử dụng Zend_Db_Select [Zend Framework]

Zend_Db_Select thường được sử dụng để viết các câu truy vấn phức tạp, đòi hỏi phải kết nhiều bảng. Có nhiều người thích cách viết này vì nó dễ hiểu, trực quan. Một điểm nữa là nó rất có lợi trong việc phân trang...
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ừ Zend_Db_Select 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: Thực hiện truy vấn cơ sở dữ liệu

1. Cấu trúc đầy đủ:

    // Create the Zend_Db_Select object
    $select = $this->_db->select();
     
    // Add a FROM clause
    $select->from( ...specify table and columns... )
     
    // Add a WHERE clause
    $select->where( ...specify search criteria... )
     
    // Add an ORDER BY clause
    $select->order( ...specify sorting criteria... );

2. Cấu trúc rút gọn

    $select = $this->_db->select()
        ->from( ...specify table and columns... )
        ->where( ...specify search criteria... )
        ->order( ...specify sorting criteria... );

3. Cách sử dụng:

a. Lệnh From:

Ví dụ 1:
SQL: " SELECT * FROM products  "
$select = $this->_db->select()
             ->from( 'products' );

Ví dụ 2:
SQL : " SELECT p.* FROM products AS p "
$select = $this->_db->select()
             ->from( array('p' => 'products') );

Để chỉ rõ cột nào cần lấy ra, ta làm như sau:

Ví dụ 3:
SQL: " SELECT p.product_id, p.product_name
          FROM products AS p
        "
$select = $this->_db->select()
             ->from(array('p' => 'products'),
                    array('product_id', 'product_name'));
Hoặc
$select = $this->_db->select()
             ->from(array('p' => 'products'),
                    array('p.product_id', 'p.product_name'));

b. Lệnh Where

Ví dụ 1:
    // Build this query:
    //   SELECT product_id, product_name, price
    //   FROM "products"
    //   WHERE price > 100.00
     
    $select = $db->select()
                 ->from('products',
                        array('product_id', 'product_name', 'price'))
                 ->where('price > 100.00');

Ví dụ 2:
    // Build this query:
    //   SELECT product_id, product_name, price
    //   FROM "products"
    //   WHERE (price > 100.00)
     
    $minimumPrice = 100;
     
    $select = $db->select()
                 ->from('products',
                        array('product_id', 'product_name', 'price'))
                 ->where('price > ?', $minimumPrice);

Ví dụ 3:
    // Build this query:
    //   SELECT product_id, product_name, price
    //   FROM "products"
    //   WHERE (price > 100.00)
    //     AND (price < 500.00)
     
    $minimumPrice = 100;
    $maximumPrice = 500;
     
    $select = $db->select()
                 ->from('products',
                        array('product_id', 'product_name', 'price'))
                 ->where('price > ?', $minimumPrice)
                 ->where('price < ?', $maximumPrice);

Ví dụ 4:
    // Build this query:
    //   SELECT product_id, product_name, price
    //   FROM "products"
    //   WHERE (price < 100.00)
    //     OR (price > 500.00)
     
    $minimumPrice = 100;
    $maximumPrice = 500;
     
    $select = $db->select()
                 ->from('products',
                        array('product_id', 'product_name', 'price'))
                 ->where('price < ?', $minimumPrice)
                 ->orWhere('price > ?', $maximumPrice);

Ví dụ 5:
    // Build this query:
    //   SELECT product_id, product_name, price
    //   FROM "products"
    //   WHERE (price < 100.00 OR price > 500.00)
    //     AND (product_name = 'Apple')
     
    $minimumPrice = 100;
    $maximumPrice = 500;
    $prod = 'Apple';
     
    $select = $db->select()
                 ->from('products',
                        array('product_id', 'product_name', 'price'))
                 ->where("price < $minimumPrice OR price > $maximumPrice")
                 ->where('product_name = ?', $prod);

c. Lệnh Order:
    // Build this query:
    //   SELECT product_id, product_name, price
    //   FROM "products"
    //   WHERE (price > 100.00)
    //     AND (price < 500.00)
   // ORDER BY product_id DESC
     
    $minimumPrice = 100;
    $maximumPrice = 500;
     
    $select = $db->select()
                 ->from('products',
                        array('product_id', 'product_name', 'price'))
                 ->where('price > ?', $minimumPrice)
                 ->where('price < ?', $maximumPrice)
                 ->order('product_id DESC');

d. Lệnh Limit
    // Build this query:
    //   SELECT p."product_id", p."product_name"
    //   FROM "products" AS p
    //   LIMIT 10, 20
    // Equivalent to:
    //   SELECT p."product_id", p."product_name"
    //   FROM "products" AS p
    //   LIMIT 20 OFFSET 10
     
    $select = $db->select()
                 ->from(array('p' => 'products'),
                        array('product_id', 'product_name'))
                 ->limit(20, 10); // lay 20 dong tu dong thu 10

e .Join bảng:

Ví dụ 1:
    // Build this query:
    //   SELECT p."product_id", p."product_name", l.*
    //   FROM "products" AS p JOIN "line_items" AS l
    //     ON p.product_id = l.product_id
     
    $select = $db->select()
                 ->from(array('p' => 'products'),
                        array('product_id', 'product_name'))
                 ->join(array('l' => 'line_items'),
                        'p.product_id = l.product_id');

Ví dụ 2:
    // Build this query:
    //   SELECT p."product_id", p."product_name", l."line_items_id"
    //   FROM "products" AS p JOIN "line_items" AS l
    //     ON p.product_id = l.product_id
     
    $select = $db->select()
                 ->from(array('p' => 'products'),
                        array('product_id', 'product_name'))
                 ->join(array('l' => 'line_items'),
                        'p.product_id = l.product_id',
                        array('line_items_id') ); 

4. Lấy kết quả truy vấn:
    $select = $this->_db->select()
                 ->from('products');
     
    $stmt = $select->query();
    $result = $stmt->fetchAll();
Lấy dòng đầu tiên của truy vấn.
    $select = $db->select()
                 ->from('products');
     
    $stmt = $select->query();
    $result = $stmt->fetch();

Nguồn: http://framework.zend.com

Không có nhận xét nào:

Đăng nhận xét