上下文:鉴于以下查询:
$queryBuilder = $this->createQueryBuilder("cv")
->leftJoin('cv.user', 'u')
->where('cv.game = :game')
->setParameter('game', $game);
将触发1 + X个不同的查询(一个获取所有CV,然后如果在模板中使用u.user,将触发X其他查询以获取用户)。
如果我想优化并将多个未经优化的查询减少为1个单一查询,我会这样做:
$queryBuilder = $this->createQueryBuilder("cv")
->select('cv, u')
->leftJoin('cv.user', 'u')
->where('cv.game = :game')
->setParameter('game', $game);
这样,我将能够保存X查询。
现在,我的问题出在我的存储库中,我有条件joins
和我希望将select
别名链接到我的代码中的不同位置。
喜欢(简化示例):
$queryBuilder = $this->createQueryBuilder("cv")
->select('cv, u')
->leftJoin('cv.user', 'u')
->where('cv.game = :game')
->setParameter('game', $game);
if ($myCondition === true) {
$queryBuilder->add('select', 'l');
$queryBuilder->join('cv.level', 'l');
}
但似乎add->('select')
不会像addWhere()
那样堆叠。
除了使用像这样的自定义解决方案还有其他解决方案:
$queryBuilder = $this->createQueryBuilder("cv")
->leftJoin('cv.user', 'u')
->where('cv.game = :game')
->setParameter('game', $game);
$aliases = array('cv', 'u');
if ($myCondition === true) {
$aliases[] = 'l';
$queryBuilder->add('select', 'l');
$queryBuilder->join('cv.level', 'l');
}
$queryBuilder->select(implode(',', $aliases);
感谢。
答案 0 :(得分:0)
// Replace
$queryBuilder->add('select', 'l');
// With
$queryBuilder->addSelect('l');
还有一些未经请求的建议。我知道有多少“未优化的查询”会打扰大多数人,包括我自己。但是,请考虑在大型数据集上做一些基准测试。令人惊讶的是,延迟加载的速度有多快。即使有成千上万的查询也没有什么区别。