【问题标题】:How to use a query builder object inside an IN clause of another query builder object如何在另一个查询构建器对象的 IN 子句中使用查询构建器对象
【发布时间】:2015-06-18 16:04:14
【问题描述】:

我需要创建一个使用 IN 语句的查询构建器表达式,我想在其中放置另一个由 querybuilder 创建的查询。在 DQL 中,我可以得到的查询是:

SELECT u
FROM BundleUsuarioBundle:Usuario u
WHERE u.id IN (
    SELECT u2.id
    FROM BundleTramiteBundle:ExamenTeorico et
    JOIN et.usuarioHabilitacion u2
    WHERE u2.centro = :centro
) ORDER BY u.apellido ASC, u.nombre ASC

但我不使用它,因为我需要将它放在表单实体字段的“query_builder”选项中。所以,我需要一个 QB,但我不知道如何嵌套 querybuilder 表达式。我实际上有两个 QueryBuilder 格式的查询,但分开了:

$qb = $this->em->createQueryBuilder();

$qb
    ->select('usuario_habilitacion.id')
    ->from('BundleTramiteBundle:ExamenTeorico', 'examen_teorico')
    ->join('examen_teorico.usuarioHabilitacion', 'usuario_habilitacion');

$user = $this->getUser();
if ( !$this->esTipoASPV($user) ) {
    $centro = $this->getCentro();

    $qb
        ->andWhere($qb->expr()->eq('usuario_habilitacion.centro', ':centro'))
        ->setParameter(':centro', $centro->getId());
}

和:

    $er
        ->createQueryBuilder('u')
        ->where($qb->expr()->in('u.id', ___???___ ))
        ->addOrderBy("u.apellido", "ASC")
        ->addOrderBy("u.nombre", "ASC");

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    您可以在第一个查询中获取子查询的结果,但调用 getDQL() 并将其放在第一个查询的 where 子句中。确保在子查询中选择 id。

    例子:

    $qb->andWhere($qb->expr()->in('u.id', $er->getDQL()))
    

    【讨论】:

    • 问题是内部查询的参数。因为我需要在创建那个查询的函数中设置这些参数,但是如果我这样做,然后使用你放在这里的代码,内部查询的参数就会丢失。
    • 如果子查询中有参数,仍然可以像上面一样使用getDQL(),但不是在子查询中设置参数,而是在外部查询中设置参数。所以假设 $er 有一个参数,':centro' 并且 $qb 是外部查询,$qb->setParameter('centro', $someValue)。
    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多