usar una tipos subconsultas subconsulta resultado otro otra mas ejemplos dentro consultas consulta con complejas columna anidadas doctrine-orm

doctrine orm - tipos - Doctrine 2: cómo se usa una columna de subconsulta(en la cláusula SELECT)



tipos de subconsultas sql (2)

Estoy tratando de hacer una consulta de selección simple con una subconsulta en la cláusula SELECT y simplemente no he encontrado una manera de hacerlo. Lo he intentado tanto con DQL como con QueryBuilder, ninguno funciona. El código siguiente, por favor, no diga que solo podría usar una combinación, este es un ejemplo simplificado para ilustrar el problema, tengo casos de uso legítimos para subconsultas.

// With QueryBuilder $query = $qb->select(array(''a'', ''(SELECT at.addresstypeName FROM e:Addresstype at WHERE at.addresstypeId = a.addresstypeId ) AS addresstypeName'')) ->from(''e:Address'', ''a'') ->where(''a.addressId = :addressId'') ->setParameter(''addressId'', 1); // With DQL $dql = "SELECT a, (SELECT at.addresstypeName FROM e:Addresstype at WHERE at.addresstypeId = a.addresstypeId ) AS addresstypeName FROM e:Address a WHERE a.addressId = :addressId"; $query = $em->createQuery($dql)->setParameter('':addressId'', 1);

La siguiente relación se define en la tabla de direcciones:

/** * @ORM/ManyToOne(targetEntity="Addresstype") * @ORM/JoinColumns({ * @ORM/JoinColumn(name="addresstype_id", referencedColumnName="addresstype_id") * }) */ protected $addresstype;

En SQL nativo, la consulta se vería así:

SELECT a.*, ( SELECT at.addresstype_name FROM addresstype at WHERE at.addresstype_id = a.addresstype_id ) AS addresstype_name FROM address a WHERE a.address_id = 1

¿Algunas ideas?


Para mí la subconsulta con doctrina trabaja con esta consulta:

$qb->select(''e.field'') ->addSelect(''(SELECT count(mv.nm) FROM Clt/Bundle/MyBundle/Entity/MV mv LEFT JOIN Clt/Bundle/MyBundle/Entity/M ma WITH mv.nm=ma.nm WHERE mv.ne=e.ne and ma.nm is null ) AS nm'' ) ->from($this->_entityName, ''e'') ->leftJoin(''e.m'', ''m'') ->where($qb->expr()->eq(''t.id''.$typeModule, $idElementModule));

Tenga en cuenta que en la unión izquierda debe usar WITH en lugar de ON ...


$query = $qb->select(''a'') ->addSelect(''(SELECT at.addresstypeName FROM e:Addresstype at WHERE at.addresstypeId = a.addresstypeId) AS addresstypeName'' ) ->from(''e:Address'', ''a'') ->where(''a.addressId = :addressId'') ->setParameter(''addressId'', 1);