别忘了 afterFind 回调函数
很多像我一样的初学者会问类似这样的问题:如何获取一篇帖子的总评论数?当然,有很多答案,但最简单的答案是“别忘了在你的 Post 模型中使用 afterFind 回调函数!”
假设你拥有 Post 和 Comment 模型,其中 Post 模型拥有多个 Comment,而 Comment 模型则属于 Post。现在我们想找到所有帖子以及每个帖子的评论数,我们可以在 posts_controller 中执行以下代码
function index(){
$this->Post->unbindModel(array('hasMany' => array('Comment')), false);
// Notice the above line
$posts = $this->Post->find('all');
$this->set('posts', $post);
}
我们使用 unbindModel 方法来提高性能,通过停止对 Comment 模型的非必要数据库查询来实现。现在让我们来看看 Post 模型中 afterFind 的魔力
function afterFind($results, $primary = false) {
parent::afterFind($results, $primary);
foreach($results as $key => $val){
if (isset($val['Post']['id'])){
$results[$key]['Post']['commentsCount'] = $this->Comment->find('count', array('conditions' => array('Comment.post_id' => $results[$key]['Post']['id'])));
}
}
return $results;
}
在上面的代码中,我们能够在 Post 结果数组中添加一个新的键 -commentsCount-,它的值是从 Commen 模型中检索到的。使用此解决方案,我们可以在索引视图中执行以下操作
<?php foreach ($posts as $post): ?>
<h1><?php echo $post['Post']['title'];?></h1>
<span>There are <?php echo $post['Post']['commentsCount'];?> comments for this post</span>
<div><?php echo $post['Post']['content'];?></div>
<?php endforeach; ?>
我在 CakePHP 1.2.11 中测试了此代码,以下是对 afterFind 回调函数的文档链接:https://book.cakephp.com.cn/1.2/en/view/681/afterFind
我希望这篇文章对你有用,而且很明显,它可以应用于任何 hasMany 关系。