php doctrine2 dql discriminator

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'')



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)