我有一个QueryBuilder查询,可以工作,但非常贪婪。我想知道我是否可以优化它。
这是我的实体设置:我有n(十几(个项目(p(,有n(可以是数千(个介质(m(,有1个转录(t(,有n(可以是几千(个转录日志(l(。
我想检索所有项目,按其最后一个转录日志(createdAt属性(排序。我想有一些方法可以优化它,但我无法找到自己的方法。
return $this->createQueryBuilder('p')
->select('p')
->leftJoin('p.medias', 'm')
->leftJoin('m.transcription', 't')
->leftJoin('t.transcriptionLogs', 'l')
->andWhere('p.archived = 0')
->addOrderBy('l.createdAt', 'DESC')
->addOrderBy('p.id', 'DESC')
->getQuery()
->getResult();
谢谢!
如果您对查询本身提出质疑,我不知道如何对其进行更优化。
但是,您可以优化其他代码使用它的方式。您可以通过向查询中添加一些SELECT
来完成此操作。这样,当你在Controller或Twig中循环你的数据时,Doctrine将有一个分组查询,而不是多个查询。
这就是你可以做到的:
return $this->createQueryBuilder('p')
->leftJoin('p.medias', 'm')
// Joining the transcription and adding the select
->leftJoin('m.transcription', 't')
->addSelect('t')
// And doing the same for the logs
->leftJoin('t.transcriptionLogs', 'l')
->addSelect('l')
->andWhere('p.archived = 0')
->addOrderBy('l.createdAt', 'DESC')
->addOrderBy('p.id', 'DESC')
->getQuery()
->getResult()
;