Jun
22

Sử dụng bindModel() và unbindModel()

Thông thường, với các bảng có các mối quan hệ một-nhiều hoặc nhiều-nhiều, chúng ta sẽ định nghĩa các mối quan hệ này trong model, và đương nhiên nó sẽ có tính chất cố định trong toàn ứng dụng. Có cách nào để thiết lập/bỏ thiết lập các mối quan hệ này vào bất cứ lúc nào ta muốn?

Chúng ta xét ví dụ sau:

- Chúng ta có bảng product_categories (danh mục sản phẩm) và products (sản phẩm), tương ứng là các model ProductCategory Product. Quan hệ ở đây là: một danh mục sản phẩm có một hoặc nhiều sản phẩm
- Chúng ta muốn rằng, khi lấy thông tin của một danh mục nào đó thì cũng đồng thời ta có được danh sách sản phẩm trong danh mục đó
- Trong file app/models/product.php, ta thêm đoạn sau:

var $hasMany = array(
		'Product' =>
    	array('className' => 'Product',
                         'conditions'    => '',
                         'order'         => '',
                         'limit'         => '',
                         'foreignKey'    => 'category_id',
                         'dependent'     => true,
                         'exclusive'     => false,
                         'finderQuery'   => '',
                         'fields'        => '',
                         'offset'        => '',
                         'counterQuery'  => ''
    )
  );

như vậy ta đã định nghĩa rằng một ProductCategory sẽ có nhiều Product. Khi lấy thông tin về một ProductCategory thông qua hàm

$this->ProductCategory->read(null, $id)

ta có thông tin dạng sau:

Array
(
    [ProductCategory] => Array
        (
            [id] => 4
            [name] => Đồ nhậu
            [created] => 2010-06-20 09:14:07
            [modified] => 2010-06-20 09:14:11
        )
 
    [Product] => Array
        (
            [0] => Array
                (
                    [id] => 4
                    [category_id] => 4
                    [name] => Cháo bò
                    [created] => 2010-06-21 16:59:03
                    [modified] => 2010-06-21 16:59:06
                )
 
            [1] => Array
                (
                    [id] => 9
                    [category_id] => 4
                    [name] => Giò heo
                    [created] => 2010-06-21 16:59:16
                    [modified] => 2010-06-21 16:59:18
                )
 
        )
 
)

Như vậy, từ danh mục Đồ nhậu ta có 2 sản phẩm là: Cháo bòGiò heo

Nếu không cấu hình gì thêm trong biến $hasMany ở trên thì trong mọi trường hợp, thông tin về danh mục Đồ nhậu sẽ cho kèm theo thông tin của Cháo bò và Giò heo như trên.

1. unbindModel()

- Một ngày đẹp trời nào đó, ta muốn rằng, khi lấy thông tin Đồ nhậu trong hàm ABC() nào đó, Cháo bò và Giò heo sẽ không xuất hiện!
- Cách làm: thêm đoạn code sau vào dòng trước dòng lấy thông tin danh mục

$this->ProductCategory->unbindModel(
        array('hasMany' => array('Product'))
    );

Bây giờ, cũng dùng hàm

$this->ProductCategory->read(null, $id)

kết quả sẽ là:

Array
(
    [ProductCategory] => Array
        (
            [id] => 4
            [name] => Đồ nhậu
            [created] => 2010-06-20 09:14:07
            [modified] => 2010-06-20 09:14:11
        )
 
)

Không hề có Cháo bò và Giò heo ở đây!

2. bindModel()

- Nếu để ý, bạn sẽ thấy rằng trong $hasMany có vài key quan trọng: conditions, order, limit, fields. Nếu để rỗng, dữ liệu sẽ ra như đã nói ở trên. Bây giờ, bạn muốn rằng: khi lấy thông tin Đồ nhậu thì chỉ có 1 sản phẩm xuất hiện kèm nó mà thôi, và chỉ cần tên sản phẩm thôi. Chui vào app/models/product.php để sửa lại thông số ư? Nếu bạn muốn khác đi nữa thì sao? Không thể làm thế được.

- Cách làm: thêm đoạn code sau trước dòng lấy dữ liệu

$this->ProductCategory->bindModel(
        array('hasMany' => array(
                'Product' => array(
                    'className' => 'Product',
		    'foreignKey' => 'category_id',
		    'limit' => 1,
		    'fields' => 'name'
                )
            )
        )
    );

Kết quả:

Array
(
    [ProductCategory] => Array
        (
            [id] => 4
            [name] => Đồ nhậu
            [created] => 2010-06-20 09:14:07
            [modified] => 2010-06-20 09:14:11
        )
 
    [Product] => Array
        (
            [0] => Array
                (
                    [name] => Cháo ḅò
                    [category_id] => 4
                )
 
        )
 
)

Lưu ý: bạn thay $id bằng id của danh mục sản phẩm

2 Comments to “Sử dụng bindModel() và unbindModel()”

  • Trần NGọc 17/02/2012 at 10:45 pm

    unbindModel() và recursive khác nhau chỗ nào.Mình thấy sử dụng recursive cũng ra kết quả tương tự.

  • admin 26/02/2012 at 1:25 am

    Recursive dùng để giới hạn độ sâu mối quan hệ giữa các model khi lấy data

    unbindModel() dùng để loại bỏ mối quan hệ của model

Post comment

Follow us on Twitter! Follow us on Twitter!
Diễn đàn CakePHP cho người Việt Nam

Bài viết mới

Thảo luận mới

TAG

Calendar

June 2010
M T W T F S S
    Jul »
 123456
78910111213
14151617181920
21222324252627
282930  

Lưu trữ

Blogroll

Thống kê

5 khách