问题描述
我有一个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()
;