我有一个模型,评论,属于模块,照片,评论,文章和用户。反过来,每个模型都有很多评论。
用户属于阿凡达和阿凡达有很多用户
在下面的代码中,我成功检索了最新的5条评论,无论它们来自哪个模型(照片,文章,评论),我都会显示一些有关用户的信息(用户名,在线状态)。
$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->像这样的头像......
'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')
)
),
)
)));
请注意,这两个发现是在preRender的AppController中执行的,因为$ page_id> 0. $ page_id在当前控制器中设置。我知道人们可能会问这个问题,但问题不在于我提到的示例2检索最近的文章目前是有效的。
编辑:我发现它与Article模型中的afterfind回调有关。有没有办法可以在afterfind和/或$ recentComments查询中调整查询,这样它们仍可以在不破坏我的包含的情况下工作?我在$ 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
答案 0 :(得分:0)
答案 1 :(得分:0)
现在我改变了(在查找后的文章模型中)
if (isset($val['Article']['id']))
到
if (isset($val['Article']['id']) && $val == "article")
似乎在当前控制器中工作但需要进一步测试。有更好的解决方案吗?