我不确定问题标题,但试图在下面解释更多。感谢所有帮助我的人。
我对表格进行了抽样以简化我的问题。
数据库表
用户正在向新闻发布评论。在输入"日期间隔01.10.2015 - 05.11.2015"的搜索中,结果应包括:在此间隔之间评论的新闻。并且comment_count应显示在屏幕标题旁边。这个comment_count不是整个comment_count,只是这个日期之间的计数。
为此,我先在评论中运行查询。然后计算评论。然后按news_id分组。
$Data = $this->Comment->find('all', array(
'fields' => array(
'News.news_id','News.title'
),
'conditions' => array(
"Comment.created >=" => date('Y-m-d', strtotime("-1 days")) //yesterday's commented news
),
'contain' => array(
'News' => array(
'Comment => array(
'fields' => array('COUNT(Comment.id) as comment_count'),
)
)
),
'group' => array('News.title')
));
结果如下,嵌套太多:
Array
(
[0] => Array
(
[News] => Array
(
[id] => 27
[title] => sample news title
[News] => Array
(
[id] => 27
[title] => sample news title
[Comment] => Array
(
[0] => Array
(
[News_id] => 27
[Comment] => Array
(
[0] => Array
(
[Comment_count] => 1
)
)
)
)
)
)
)
)
总之,为了达到comment_count,我必须手动编写嵌套。但是我想在第一个[title]节点的同一级别上达到它。
$JsonData [] = array(
"id" => $Item["News"]["id"],
"title" => $Item["News"]["title"],
"comment_count" => $Item["News"]["News"]["Comment"][0]["Comment"][0]["comment_count"]
);
如何减少终身嵌套?
提前致谢。
答案 0 :(得分:1)
首先,您应将表格ID命名为id
而不是news_id
。对于你的问题,我不确定你在哪个控制器上显示新闻,IMO应该在NewsController
中完成。以下是如何使用前一天的评论计数检索您的新闻:
$Data = $this->News->find('all', array(
'fields' => array(
'News.id',
'News.title',
'COUNT(Comment.id) as comment_count'
),
'group' => array('News.id'),
'joins' => array(
array(
'table' => 'comments',
'alias' => 'Comment',
'conditions' => array(
'News.id = Comment.news_id',
'Comment.created >=' => date('Y-m-d', strtotime("-1 days"))
)
)
)
));
这应该给你这样的结果数组:
array(
(int) 0 => array(
'News' => array(
'id' => '1',
'title' => 'New news'
),
(int) 0 => array(
'comment_count' => '2'
)
),
(int) 1 => array(
'News' => array(
'id' => '2',
'title' => 'Seconds news'
),
(int) 0 => array(
'comment_count' => '1'
)
),
)
然后你可以得到你的评论数(假设通过foreach循环):
... "comment_count" => $Data[0]['comment_count'] ...
你应该看counterCache它可能对你有用。