如何在另一个查询构建器对象的IN子句中使用查询构建器对象

时间:2015-06-18 16:04:15

标签: symfony doctrine-orm

我需要创建一个使用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");

1 个答案:

答案 0 :(得分:0)

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

示例:

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