我想如果有可能(以及如何)将OneToMany关系基数用作findBy过滤器。
例如,在这里,假设我有两个实体User
和Post
,它们之间具有OneToMany关系,以便用户拥有一组帖子。
我正在寻找一种方法让所有至少有一个帖子的用户,也就是说:
|user.posts| >= 1
或更多编程count(user->getPosts()) >= 1
我知道这可以通过QueryBuilder或DQL来实现,但我确信有一个技巧可以让它与findBy
一起使用。
以下是我愿意做的事情:
class UserRepository extends EntityRepository
{
public function myQuery()
{
return $this->findBy(
array(... 'posts' ...), // What should I put here ?
array('email' => 'ASC')
);
}
}
答案 0 :(得分:4)
评论中的人是完全正确的,所以我在总结:
findBy
无法在OneToMany
上使用,特别是因为您希望根据相关实体的数量找到。
这意味着您必须使用QueryBuilder
。
在UserRepository
中,使用以下内容:
$qb = $this->createQueryBuilder('users')
->leftJoin('user.posts', 'posts')
->addGroupBy('users')
->having('COUNT(posts) >= :limit')
->setParameter('limit', 1);
Posts
限制为1,正如@Yoshi所述,您可以使用INNER JOIN
代替GROUP BY
+ HAVING
,它会自动取消选择Users
,而不会Post
。而不是上面的内容,请使用:
$qb = $this->createQueryBuilder('users')
->innerJoin('user.posts', 'posts');