我有同样的问题。PawelMysior提供的答案很好,带来了解决方案。
在CakePHP手册中我找到了更多的细节: 3.7.4.1.1 counterCache - 缓存计数器。这对我很有用,但还是有点模糊。为了其他人着想,我想提供一些进一步的细节。
我有两个表: 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 添加到现有的数据库结构中,在添加另一个 Image
之前,Post
中的计数将为零。此时,CakePHP 将进行实际计数并将 image_count
更新为正确的数量。
希望这个额外的信息对某人有帮助。