在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时结果至少会有多少行,或者更多行。
这是预期的吗?
UPDATE
所以我认为这种混淆的实际原因似乎是在上面的查询后添加的分页:
$query
->setMaxResults(20)
->setFirstResult(0);
看起来这与上面使用的leftJoin效果不佳(这就是为什么结果计数在第一个例子中是正确的)。使用leftJoins时如何让它返回正确的行数?
如果您的左连接属于多个关系,则它是SQL中常见的笛卡尔积。来自obj
的行扩展了sd
和ssd
的所有可能值。
如果要在DQL中使用toMany关系对查询进行分页,则需要一个适当的分页器来处理doctrine水合作用。