在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时返回正确的行数?
答案 0 :(得分:1)
如果您的左连接属于多个关系,则它是SQL中常见的笛卡尔积。来自obj
的行会扩展为sd
和ssd
的所有可能值。
如果要在DQL中使用toMany关系对查询进行分页,则需要一个适当的分页器来处理主义水合作用。