CakePHP 2.4.2:包含未按预期工作

CakePHP 2.4.2:包含未按预期工作,cakephp,model,cakephp-2.0,relationships,Cakephp,Model,Cakephp 2.0,Relationships,我有一个模型,评论,属于模块,照片,评论,文章和用户。反过来,这些模型中的每一个都有许多评论 用户属于头像,头像有多个用户 在下面的代码中,我成功地检索到了最新的5条评论,无论它们来自哪种型号(照片、文章、评论),并且我显示了一些关于用户的信息(用户名、在线状态) 不幸的是,这方面存在一些问题。正如您在上面看到的,我不包含User->Avatar,所有预期的数据都已成功检索 $recentComments = Array ( [0] => Array (

我有一个模型,评论,属于模块,照片,评论,文章和用户。反过来,这些模型中的每一个都有许多评论

用户属于头像,头像有多个用户

在下面的代码中,我成功地检索到了最新的5条评论,无论它们来自哪种型号(照片、文章、评论),并且我显示了一些关于用户的信息(用户名、在线状态)

不幸的是,这方面存在一些问题。正如您在上面看到的,我不包含User->Avatar,所有预期的数据都已成功检索

$recentComments = Array
(
    [0] => Array
        (
            [Comment] => Array
                (
                    [id] => 179
                    [page_id] => 2
                    [module_id] => 3
                    [page] => 
                    [user_id] => 29
                    [post_id] => 9
                    [title] => test comment for article 9
                    [content] => here is the content for the comment
                    [created] => 2013-04-24 00:00:00
                    [redeemed] => 0
                    [status] => 0
                )

            [User] => Array
                (
                    [username] => bowlerae
                    [online] => 0
                )

            [Module] => Array
                (
                    [model] => Article
                    [post_title] => title
                )

            [Article] => Array
                (
                    [title] => Test title for article 9
                    [id] => 9
                    [likes] => 0
                    [dislikes] => 0
                    [comments] => 2
                )

            [Photo] => Array
                (
                    [id] => 
                )

            [Review] => Array
                (
                    [title] => 
                    [id] => 
                )

        )
然而,如果我包含像这样的用户->化身

   'User' => array(
        'fields' => array('User.username', 'User.online'),
        'Avatar' => array(
            'fields' => array('Avatar.file')
        )
    ),
然后递归基本上变得无限,所有与评论、用户、模块、文章、照片和评论相关的模型也被检索到,这是非常多的

有人能解释为什么会这样吗?如果需要的话,我很乐意从一些模型中提交更多的代码,但我没有看到任何问题

看看另一个成功的例子……下面我将检索最近的5篇文章。成功检索包括用户化身在内的所有信息

        $this->set('articles_sidebar', ClassRegistry::init('Article')->find('all',
array(
    'limit' => '5',
    'order' => array('Article.id' => 'desc'),
    'conditions' => array('
        Article.page_id' => $page_id
    ),
    'contain' => array(
       'User' => array(
            'fields' => array('User.username', 'User.online'),
            'Avatar' => array(
                'fields' => array('Avatar.file')
            )
        ),
    )
)));
请注意,如果$page_id>0,这两个查找将在beforeRender中的AppController中执行$页面id设置在当前控制器的任何位置。我知道人们可能会问这个问题,但这不是问题所在,因为我提到了示例2检索最近的文章目前是有效的

编辑:我发现这与文章模型中的afterfind回调有关。有没有办法调整afterfind和/或$recentComments查询中的查询,使它们在不破坏我的contain的情况下仍能工作?我不需要$recentComments查询中的“喜欢”、“不喜欢”或“评论”虚拟字段,这就是为什么它们不作为包含的字段之一列出的原因

function afterFind($results, $primary = false) {
parent::afterFind($results, $primary);


          foreach($results as $key => $val){
               if (isset($val['Article']['id'])){    

                        $results[$key]['Article']['likes'] = $this->Like->find('count', array('conditions' => array('Like.post_id' => $results[$key]['Article']['id'], 'Like.module_id' => 3, 'Like.status' => 0)));


                        $results[$key]['Article']['dislikes'] = $this->Like->find('count', array('conditions' => array('Like.post_id' => $results[$key]['Article']['id'], 'Like.module_id' => 3, 'Like.status' => 1)));


                        $results[$key]['Article']['comments'] = $this->Comment->find('count', array('conditions' => array('Comment.post_id' => $results[$key]['Article']['id'], 'Comment.module_id' => 3, 'Comment.status < 2')));
               }
          } // end for each


      return $results;

} // end afterfind
函数afterFind($results,$primary=false){
父项::afterFind($results,$primary);
foreach($结果为$key=>$val){
如果(isset($val['Article']['id']){
$results[$key]['Article']['likes']=$this->Like->find('count',array('conditions'=>array('Like.post\u id'=>$results[$key]['Article']['id'],'Like.module\u id'=>3,'Like.status'=>0));
$results[$key]['Article']['dislikes']=$this->Like->find('count',array('conditions'=>array('Like.post\u id'=>$results[$key]['Article']['id'],'Like.module\u id'=>3,'Like.status'=>1));
$results[$key]['Article']['comments']=$this->Comment->find('count',array('conditions'=>array('Comment.post\u id'=>$results[$key]['Article']['id'],'Comment.module\u id'=>3,'Comment.status<2');
}
}//每个都结束
返回$results;
}//结束后发现

我猜你的问题是:

使用“字段”和“包含”选项时,请小心包含所有 查询直接或间接需要的外键

确保您包括了用于加入用户和化身模型的任何字段

现在我改变了(在文章model afterFind中)


似乎在当前控制器中工作,但需要进一步测试。有更好的解决方案吗?

CakePHP 2.4.2?2.3.3是最新的稳定版本。当我包含User.avatar_id和avatar.id字段时,它仍然不起作用。请尝试删除任何/所有“字段”细节,以查看它是否有效,然后-如果有效,请一次将它们添加回一个。我在问题中添加了一个编辑以及可能的答案。
function afterFind($results, $primary = false) {
parent::afterFind($results, $primary);


          foreach($results as $key => $val){
               if (isset($val['Article']['id'])){    

                        $results[$key]['Article']['likes'] = $this->Like->find('count', array('conditions' => array('Like.post_id' => $results[$key]['Article']['id'], 'Like.module_id' => 3, 'Like.status' => 0)));


                        $results[$key]['Article']['dislikes'] = $this->Like->find('count', array('conditions' => array('Like.post_id' => $results[$key]['Article']['id'], 'Like.module_id' => 3, 'Like.status' => 1)));


                        $results[$key]['Article']['comments'] = $this->Comment->find('count', array('conditions' => array('Comment.post_id' => $results[$key]['Article']['id'], 'Comment.module_id' => 3, 'Comment.status < 2')));
               }
          } // end for each


      return $results;

} // end afterfind
 if (isset($val['Article']['id']))
 if (isset($val['Article']['id']) && $val == "article")