如何在查询中动态选择别名

时间:2013-11-15 13:15:43

标签: symfony doctrine-orm

上下文:鉴于以下查询:

    $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);

感谢。

1 个答案:

答案 0 :(得分:0)

// Replace
$queryBuilder->add('select', 'l');

// With
$queryBuilder->addSelect('l');

还有一些未经请求的建议。我知道有多少“未优化的查询”会打扰大多数人,包括我自己。但是,请考虑在大型数据集上做一些基准测试。令人惊讶的是,延迟加载的速度有多快。即使有成千上万的查询也没有什么区别。