【问题标题】:CakePHP 2.4.2: Contain Not Working as ExpectedCakePHP 2.4.2:包含未按预期工作
【发布时间】:2013-04-25 02:42:33
【问题描述】:

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

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

在下面的代码中,我成功检索了最新的 5 个 cmets,无论它们来自什么模型(照片、文章、评论),并显示有关用户的一些信息(用户名、在线状态)。

$recentComments = $this->find('all',
array(
    'limit' => '5',
    'order' => array('Comment.id' => 'desc'),
    'conditions' => array(
        'Comment.page_id' => $page_id
    ),
    'contain' => array(
        'Photo' => array(
            'fields' => array('Photo.id'),
            'conditions' => array(
                'Comment.module_id' => 8
            ),
        ),
        'Review' => array(
            'fields' => array('Review.title', 'Review.id'),
            'conditions' => array(
                'Comment.module_id' => 2
            ),
        ),
        'Article' => array(
            'fields' => array('Article.title', 'Article.id'),
            'conditions' => array(
                'Comment.module_id' => 3
            ),
        ),
       'Module' => array(
            'fields' => array('Module.model', 'Module.post_title'),
        ),
      'User' => array(
            'fields' => array('User.username', 'User.online'),
        ),
    )
));

不幸的是,这存在一些问题。正如您在上面看到的,我不包含 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->Avatar...

   '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 中执行的。$page_id 设置在当前控制器的任何位置。我知道人们可能会问这个问题,但这不是问题所在,因为我提到示例 2 检索最近的文章目前有效。

编辑:我发现这与我在 Article 模型中的 afterfind 回调有关。有没有办法可以调整 afterfind 和/或 $recentComments 查询中的查询,以便它们仍然可以工作而不会破坏我的包含?我的 $recentComments 查询中不需要喜欢、不喜欢或 cmets 虚拟字段,这就是为什么它们没有被列为包含字段之一的原因。

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

【问题讨论】:

  • CakePHP 2.4.2? 2.3.3 是最新的稳定版本。

标签: cakephp model cakephp-2.0 relationships


【解决方案1】:

我猜你的问题是这样的:

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

确保您包含用于连接用户和头像模型的任何字段。

(read here)

【讨论】:

  • 当我包含 User.avatar_id 和 Avatar.id 字段时它仍然不起作用
  • 尝试删除任何/所有“字段”细节,看看它是否有效,然后 - 如果有效,一次将它们添加回来。
  • 我添加了对问题的编辑以及可能的答案。
【解决方案2】:

现在我改变了(在文章模型 afterFind)

 if (isset($val['Article']['id']))

 if (isset($val['Article']['id']) && $val == "article")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 2014-01-28
    • 1970-01-01
    • 2013-06-04
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多