【发布时间】:2018-10-10 04:50:13
【问题描述】:
我有一个包含 Rounds 和 Users 的数据库。 Rounds belongsToMany Users 和 Users belongsToMany Rounds,所以是多对多的关系。添加了一个连接表 rounds_users 来执行此操作。 编辑:在这里使用了不正确的短语。我的意思是“belongsToMany”而不是“hasMany”
现在我想检索轮次列表,以及每轮链接的用户数。
在一对多关系的情况下,如下所示:
$rounds = $this->Rounds->find()
->contain(['Users' => function ($q)
{
return $q->select(['Users.id', 'number' => 'COUNT(Users.round_id)'])
->group(['Users.round_id']);
}
]);
...根据Count in contain Cakephp 3
但是,在多对多关系中Users.round_id 不存在。那么,有什么办法可以代替呢?
注意:类似这样的问题已经有人问过了,但是关于 CakePHP 3.x 的问题很少,所以我还是想试试看。
注意 2:我可以通过使用 PHP 函数 count 来解决这个问题,但我宁愿做得更优雅
编辑:如下所示,手动加入似乎可以解决问题:
$rounds_new = $this->Rounds->find()
->select($this->Rounds)
->select(['user_count' => 'COUNT(Rounds.id)'])
->leftJoinWith('Users')
->group('Rounds.id');
...有一个问题!没有用户的回合仍然得到等于 1 的 user_count。可能是什么问题?
【问题讨论】:
-
你总是可以加入关联而不是包含它们(有点像你的 SUM() on ManyToMany question)...除此之外,如果你明确地创建了
hasMany关联(而不是belongsToMany),那么你有一个one Rounds to many RoundsUsers关系,即你仍然可以通过RoundsUsers使用“包含计数”示例,不是吗? -
@ndm 哎呀,我用错了词组。真的是多对多。手动加入似乎是要走的路,我添加了一个例子。这确实导致了一个新问题。
-
尝试使用 innerJoinWith 而不是 leftJoinWith !
-
@ManoharKhadka
COUNT通常不计算NULL值,即它应该与LEFT连接一起工作,这实际上可能是 OP 想要的,即检索所有轮次,并且没有用户的回合计数0。如果那些0用户轮次是不需要的,那么我建议INNER也加入。 -
话虽如此,你不想指望
Users吗?
标签: cakephp count many-to-many cakephp-3.0 query-builder