我有同樣的問題。 PawelMysior給出的答案很好,並導致瞭解決方案。
我在CakePHP書中找到了更多的細節:3.7.4.1.1 counterCache - Cache your count()。這很有幫助,但仍有點模糊。爲了其他人的緣故,我想提供一些進一步的細節。
我有兩個表:Post和Image。當我向帖子添加圖片時,我想跟蹤每篇帖子在帖子索引列表中顯示的圖片數量,而無需在圖片表上運行額外的計數查詢。
CREATE TABLE posts
(
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
user_id INTEGER UNSIGNED NOT NULL,
title VARCHAR(255),
body TEXT,
created DATETIME,
modified DATETIME,
image_count INTEGER UNSIGNED,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE images
(
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
post_id INTEGER UNSIGNED NOT NULL,
filename VARCHAR(255),
created DATETIME,
modified DATETIME,
PRIMARY KEY (id)
) ENGINE=InnoDB;
注意,image_count
雲在posts
表。 images
表中沒有什麼特別的。
class Post extends AppModel
{
var $name = 'Memory';
var $hasMany = array(
'Image' => array(
'className' => 'Image',
'foreignKey' => 'post_id',
'dependent' => false
)
);
}
class Image extends AppModel
{
var $name = 'Image';
var $belongsTo = array(
'Post' => array(
'className' => 'Post',
'foreignKey' => 'post_id',
'counterCache' => true
)
);
}
注意counterCache
被添加到Image
模型。 Post
模型沒有什麼特別的。
$this->Post->Behaviors->attach('Containable');
$post = $this->Post->find('all', array(
'conditions' => array('user_id' => 7),
'order' => array('Post.created DESC'),
'contain' => array(
'Post' => array(
'User' => array('first_name', 'last_name')
)
)
));
現在,當我們做一個find
沒有必要做任何特殊找到計數,因爲它會自動在Post
結果的字段。請注意下面的image_count
。
Array
(
[Post] => Array
(
[0] => Array
(
[id] => 14
[user_id] => 7
[title] => Another great post
[body] => Lorem ipsum...
[created] => 2011-10-26 11:45:05
[modified] => 2011-10-26 11:45:05
[image_count] => 21
[User] => Array
(
[first_name] => John
[last_name] => Doe
)
)
)
)
有一點需要注意,如果你添加counterCache到現有的數據庫結構,在Post
計數爲零,直到另一個Image
加入。此時,CakePHP將執行實際計數並將image_count
更新爲正確的數量。
我希望這個額外的信息對某人有幫助。
這是一個不錯的主意,但它不能解決更復雜的查詢問題,即保持與行關聯的計數不起作用(例如用戶選擇某些條件的報告系統)。有沒有其他方法可以使用容易獲得計數? – Zxaos 2011-09-15 18:11:05