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.

¿Fue útil?

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';
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top