Symfony2 / Doctrine:findBy with OneToMany基数

时间:2016-05-18 09:06:00

标签: php symfony doctrine-orm one-to-many

我想如果有可能(以及如何)将OneToMany关系基数用作findBy过滤器。

例如,在这里,假设我有两个实体UserPost,它们之间具有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')
        );
    }
}

1 个答案:

答案 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');