php - Doctrine 2-Cómo utilizar la columna discriminator en where cláusula
doctrine2 dql (5)
Se usó la columna discriminadora en donde cláusula como esta:
//f = root entity
$qb = $this->createQueryBuilder(''f'');
$qb->add(''where'', ''f.format = /'image/' OR f.format = /'text/''');
Tengo un error: "Mensaje: [Error semántico] línea 0, col 73 cerca ''formato ='' imagen '''': Error: Clase Entities / File / AbstractFile no tiene ningún campo o asociación llamada formato"
¿Cómo puedo usar la columna discriminator en where clause?
Gracias.
Como esta última versión de doctrina, se admite consultar directamente el valor discriminador.
public function findOfType($discr)
{
$qb = $this->createQueryBuilder(''e'');
$qb->where(''e INSTANCE OF :discr'');
$qb->setParameter(''discr'', $discr);
return $qb->getQuery()->getResult();
}
tendrá una consulta de resultado con esta cláusula:
WHERE e0_.discr IN (''discriminator_passed_to_function'')
Creo que deberías usar INSTANCIA DE
Esta extensión de doctrina fue muy útil para mí porque necesitaba acceder a la clase principal y la INSTANCE OF
no funciona en ese caso.
https://gist.github.com/jasonhofer/8420677
Por ejemplo: tengo la siguiente estructura de clase:
BaseClass
Class1 hereda de BaseClass (discriminator = c1)
Class2 hereda de Class1 (discriminator = c2)
Class3 hereda de Class1 (discriminator = c3)
Quiero seleccionar todas las entidades de Class1 pero no de Class2 o Class3
SELECT c FROM /Class1 c WHERE TYPE(c) = ''c1'';
Se vería en el constructor de consultas de esta manera:
$class = ''Entity/File/Image'';
$qb = $this->createQueryBuilder(''f'');
$qb->where($qb->expr()->isInstanceOf(''f'', $class));
Nota : no podrá configurar la clase como parámetro porque se escapará.
para PHP 5.50 y superior:
$this->createQueryBuilder(''f'')
->andWhere(''f INSTANCE OF ''.Image::class)