-----
Phần x15. CakePHP2
– counterCache
Xem (clip số 21 – chickenrainshop):
Đọc thêm về counterCache tại đây: https://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#countercache-cache-your-count
Tính năng counterCache, giúp đếm và cập nhật tự động các mẩu
tin liên quan, thay thế cho việc đếm bằng hàm find(‘count’).
Cách làm:
- Vào bảng Books, tạo trường comment_count. Ở đây, Books có
quan hệ hasMany với Comments, việc đặt tên comment_count được đặt theo quy ước
chứ không được đặt tùy ý, cụ thể: model_count.
Trường comment_count: kiểu int, giá trị khởi tạo là 0, cho
phép NULL.
- Kích hoạt tính năng counterCache: vào model Comment, trong
phần định nghĩa quan hệ belongsTo, thêm mục ‘counterCache’ => true.
public $belongsTo = array(
'User'
=> array(
'className'
=> 'User',
'foreignKey'
=> 'user_id',
'conditions'
=> '',
'fields'
=> '',
'order'
=> ''
),
'Book'
=> array(
'className'
=> 'Book',
'foreignKey'
=> 'book_id',
'conditions'
=> '',
'fields'
=> '',
'order'
=> '',
'counterCache' => true
)
);
Trong view Books\view.ctp, thêm dòng mã sau:
<dt><?php echo __('Comments'); ?></dt>
<dd>
<?php
echo h($book['Book']['comment_count']); ?> comments
</dd>
Hàm cập nhật giá trị comment_count cho tất cả cuốn sách,
viết trong BooksController:
public function updateComments() {
$books
= $this->Book->find('all', [
'fields'
=> 'id',
'contain'
=> 'Comment'
]);
//
pr($books);
foreach
($books as $book) {
if
(count($book['Comment']) > 0) {
$this->Book->updateAll(
['comment_count'
=> count($book['Comment'])],
['Book.id'
=> $book['Book']['id']]
);
}
}
}
Đọc thêm về hàm Model->updateAll() tại đây: https://book.cakephp.org/2.0/en/models/saving-your-data.html#model-updateall-array-fields-mixed-conditions
-----------
Cập nhật 12/5/2017
-----------