Cakephp 3:获取线程中的消息计数

Cakephp 3:获取线程中的消息计数,php,cakephp,group-by,count,cakephp-3.x,Php,Cakephp,Group By,Count,Cakephp 3.x,我有3个相互交织的表(除其他表外,与此无关)。这些是人、线程和帖子。在设计我的头版时,我试图在当前帖子总数的线程名称旁边显示一个计数。如果是SQL的话,我可以很容易地做到这一点,但是使用cakephp,我会被难倒,因为我对语法不是很熟悉 表的连接方式如下(截至目前): 线程:个人id(创建线程的人) Posts:thread_id(它与哪个线程相关)、person_id(发布者) 这可以通过使用post_id进行分组来实现,正如我在sql中测试的那样。如果你能给我展示一下cakephp的语法,告

我有3个相互交织的表(除其他表外,与此无关)。这些是人、线程和帖子。在设计我的头版时,我试图在当前帖子总数的线程名称旁边显示一个计数。如果是SQL的话,我可以很容易地做到这一点,但是使用cakephp,我会被难倒,因为我对语法不是很熟悉

表的连接方式如下(截至目前): 线程:个人id(创建线程的人) Posts:thread_id(它与哪个线程相关)、person_id(发布者)

这可以通过使用post_id进行分组来实现,正如我在sql中测试的那样。如果你能给我展示一下cakephp的语法,告诉我应该怎么做,那就太好了

谢谢

[编辑] 这是一种有效的sql语法:

SELECT t.name, COUNT(p.id)
FROM posts p
JOIN threads t ON (p.thread_id = t.id)
GROUP BY t.name
按照这一逻辑,我把它做成这样:

$query = $postsTable->find();
$query->select(['threads.name', $query->func()->count('posts.id')])
              ->matching('Threads')
              ->group(['threads.name']);

包含group by子句的查询的总计数,而无需以任何方式重写查询。例如,考虑此查询以检索文章ID和它们的注释计数。
$query = $posts->find();
$query->select(['post.post_id', $query->func()->count('Comments.id')])
    ->matching('Comments')
    ->group(['post.post_id']);
$total = $query->count();
计数后,查询可用于获取与以下项关联的记录:

$list = $query->all();
有关更多示例:

更新:您刚刚添加了data structer,因此应该如下所示:

$query = $postsTable->find(); 
$query->select(['p.thread_id', 
$query->func()->count('t.id')]) 
->matching('Threads') 
->group(['p.thread_id']); 
$total = $query->count();

这是你的答案吗?这回答了你的问题吗?我不确定我的方法是否100%正确。我将更新OP,因为我无法在这里构建它们。@Badrukk这是因为你试图将
threat\u name
post\u id
相等,即name is
varchar
和id is
integer
我更新了答案,请尝试一下,并让我知道答案。我使用这个名称是为了更“易读”但即使有身份证,我也会得到同样的结果。不管怎样,我试过你的,但还是少了一个帖子。每个线程只显示一个post。另外,当将其传递到查看atm时,它的当前结构我不能说“做:$totalPosts->count($thread->id),因为所有线程都得到相同的计数。@Badrukk每个线程只显示一篇文章,所以它是您的查询部分,然后回答是正确的。我没有理解您所说的,但如果您的意思是正确的,那么就不是真的。其中一个线程有2个POST,另一个线程有1个POST,其余线程为0。如果我按Posts.thread\u id分组,结果是:[Threads]=>Array=>0]=>thread\u id=>6和[1]=>thread\u id=>8