Doctrine 查询生成器计数 ManyToMany

Zwe*_*012 4 mysql query-builder doctrine-orm

我有一个实体Offer。报价与文件具有多对多关系。现在我想要所有的优惠,有文件 -> Count(offer.files) > 0。

我这样试过,但不起作用:

$this->repository->createQueryBuilder('offer')
            ->addSelect('COUNT(offer.files) as files')
            ->having('files > 1')
            ->getQuery()
            ->getResult();
Run Code Online (Sandbox Code Playgroud)

小智 6

实际上,您不需要加入。Doctrine为此内置了SIZE DQL 函数

SIZE(collection) - 返回指定集合中元素的数量

所以你可以像这样使用它:

$this->repository->createQueryBuilder('offer')
    ->addSelect('SIZE(offer.files) as files')
    ->having('files > 1')
    ->getQuery()
    ->getResult();
Run Code Online (Sandbox Code Playgroud)


Jan*_*tis 4

您需要通过根实体提供内部加入关联和分组:

->innerJoin('offer.files', 'files')
Run Code Online (Sandbox Code Playgroud)

INNER JOIN 关键字选择在两个表中具有匹配值的记录。

然后你可以:

->addSelect('COUNT(files) as total')
->having('total > 1')
->groupBy('offer')
Run Code Online (Sandbox Code Playgroud)

如果不需要结果中的总计,可以将其定义为HIDDEN,将上面的第一行更改为:

->addSelect('COUNT(files) as HIDDEN total')
Run Code Online (Sandbox Code Playgroud)

内部联接详细 Doctrine 查询构建器