别忘了 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 关系。