Doctrina 2 - Cómo utilizar la columna discriminadora en la cláusula where
-
13-11-2019 - |
Pregunta
Yo estaba acostumbrada columna discriminadora en la cláusula where, como este:
//f = root entity
$qb = $this->createQueryBuilder('f');
$qb->add('where', 'f.format = \'image\' OR f.format = \'text\'');
Tengo un error:"Mensaje:[Semántica de Error] de la línea de 0, col 73 cerca de "formato = "imagen":Error:Clase de Entidades\Archivo\AbstractFile no tiene campo o de la asociación denominada formato"
¿Cómo puedo utilizar la columna discriminadora en la cláusula where?
Gracias.
Solución
Creo que debe usar instancia de
Otros consejos
Se vería en consultoría de consultas como esta:
$class = 'Entity\File\Image';
$qb = $this->createQueryBuilder('f');
$qb->where($qb->expr()->isInstanceOf('f', $class));
nota : que no podrá establecer la clase como un parámetro porque se escapará.
para PHP 5.50 y superior:
$this->createQueryBuilder('f')
->andWhere('f INSTANCE OF '.Image::class)
Como esta última versión de Doctrine, es compatible con la consulta directamente el valor del 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 resultados con esta cláusula:
WHERE e0_.discr IN ('discriminator_passed_to_function')
Esta doctrina de extensión fue muy útil para mí, porque yo necesitaba para acceder a la clase padre y INSTANCE OF
no funciona en ese caso.
https://gist.github.com/jasonhofer/8420677
Por ejemplo:Tengo la siguiente estructura de la clase:
BaseClass
Class1 hereda de BaseClass (discriminador = c1)
Clase2 hereda de Class1 (discriminador = c2)
Class3 hereda de Class1 (discriminador = c3)
Quiero seleccionar todas las entidades de Class1 pero no de Clase2 o Class3
SELECT c FROM \Class1 c WHERE TYPE(c) = 'c1';