--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Hiển thị các bài đăng có nhãn counterCache. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn counterCache. Hiển thị tất cả bài đăng

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