Symfony2 / Doctrine:具有 OneToMany 基数的 findBy

Symfony2 / Doctrine : findBy with OneToMany cardinality

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

例如,假设我有两个实体 UserPost,它们之间存在 OneToMany 关系,因此用户拥有 post 的集合。

我正在寻找一种方法来获取至少拥有一个 post 的所有用户,也就是说:
|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')
        );
    }
}

评论里的人完全正确,所以我总结一下:

  • findBy 不适用于 OneToMany,特别是因为您想按相关实体的数量查找。

  • 这意味着你必须使用 QueryBuilder.

在您的 UserRepository 中,使用以下内容:

$qb = $this->createQueryBuilder('users')
    ->leftJoin('user.posts', 'posts')
    ->addGroupBy('users')
    ->having('COUNT(posts) >= :limit')
    ->setParameter('limit', 1);
  • 由于在您的用例中,您想要 select 的 Posts 的限制是 1,正如@Yoshi 所说,您可以使用 INNER JOIN 而不是 GROUP BY + HAVING,这将自动取消 select Users 而没有 Post.

代替上面的,使用这个:

$qb = $this->createQueryBuilder('users')
    ->innerJoin('user.posts', 'posts');