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 và 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ò và 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
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()”
Post comment
Bài viết mới
- CakePHP version 1.3.12
- Tạo chuỗi ngẫu nhiên với 1 dòng code
- Kỹ thuật “bit field” trong phân quyền
- Làm việc với File và Folder
- CakePHP 1.3.8
- CakePHP 1.3.7 Released
- Ajax trong CakePHP
- Tạo và load file config trong CakePHP
- Làm site đa ngôn ngữ với CakePHP (Phần 1)
- CakePHP 1.3.6 and 1.2.9 released
- CakePHP 1.3.5 released
- Type hinting trong PHP
- CakePHP ra phiên bản mới 1.3.4
- Tích hợp Zend framework vào CakePHP
- Tạo virtual host trên local
- Sử dụng Acl trong cakephp – Phần 2
- Sử dụng Acl trong cakephp – Phần 1
- Sinh code tự động với cake console
- Tự động xóa record ở bảng con khi reocord ở bảng cha bị xóa
- Xác thực người dùng với component Auth
Thảo luận mới
- admin on Sử dụng session trong CakePHP
- admin on Sử dụng session trong CakePHP
- hanh on Sử dụng session trong CakePHP
- bich yen on Sử dụng session trong CakePHP
- admin on Sử dụng session trong CakePHP
- bich yen on Sử dụng session trong CakePHP
- bich yen on Sử dụng session trong CakePHP
- admin on Sử dụng Acl trong cakephp – Phần 1
- admin on Sử dụng session trong CakePHP
- Bich Yen on Sử dụng session trong CakePHP
TAG
Calendar
Lưu trữ
- September 2011 (3)
- July 2011 (1)
- March 2011 (1)
- February 2011 (1)
- November 2010 (4)
- October 2010 (1)
- September 2010 (2)
- August 2010 (9)
- July 2010 (9)
- June 2010 (22)
Blogroll
- Bakery
- Biển đảo Việt Nam
- CakePHP
- CakePHP Google Group
- CakePHP Manual
- CakePHP Questions
- Diễn đàn CakePHP VN

admin

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ự.
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