使用左连接的查询返回的行数较少

时间:2017-12-18 19:39:42

标签: sql symfony doctrine left-join

在Symfony项目中使用Doctrine会让我感到困惑。当从单个实体请求所有行时,我得到的行数比我将另一个表加入另一个时获得的行数要多。

这会返回更多行:

$query = $this->getEntityManager()->createQueryBuilder();
$query->select('obj')
    ->from('AppBundle:Data', 'obj');

比这个:

$query = $this->getEntityManager()->createQueryBuilder();
$query->select('obj')
    ->from('AppBundle:Data', 'obj')
    ->leftJoin('obj.subDatas', 'sd')
    ->leftJoin('sd.subSubDatas', 'ssd');

怎么会这样?我猜这可能是一个innerJoin的情况,但我认为使用leftJoin时结果至少会有多少行,或者更多行。

这是预期的吗?

更新

所以我认为这种混淆的实际原因似乎是在上面的查询后添加的分页:

$query
    ->setMaxResults(20)
    ->setFirstResult(0);

似乎这与上面使用的leftJoin不兼容(这就是为什么结果计数在第一个例子中是正确的)。如何在使用leftJoins时返回正确的行数?

1 个答案:

答案 0 :(得分:1)

如果您的左连接属于多个关系,则它是SQL中常见的笛卡尔积。来自obj的行会扩展为sdssd的所有可能值。

如果要在DQL中使用toMany关系对查询进行分页,则需要一个适当的分页器来处理主义水合作用。