Ngu ngơ học làm web (x15) - CakePHP2 - counterCache

Tiếp theo của: Ngu ngơ học làm web (x14) - CakePHP2 – Validate
-----

Phần x15. CakePHP2 – counterCache


Xem (clip số 21 – chickenrainshop):


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
                                    &nbsp;
                        </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ập nhật 12/5/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web