Doutrina 2 – Como usar coluna discriminadora na cláusula where
-
13-11-2019 - |
Pergunta
Usei uma coluna discriminadora na cláusula where como esta:
//f = root entity
$qb = $this->createQueryBuilder('f');
$qb->add('where', 'f.format = \'image\' OR f.format = \'text\'');
Eu tenho um erro:"Mensagem:[Erro semântico] linha 0, coluna 73 perto de 'format =' image '':Erro:A classe Entities\File\AbstractFile não possui formato nomeado de campo ou associação"
Como posso usar a coluna discriminadora na cláusula where?
Obrigado.
Solução
Eu acho que você deveria usar INSTANCIA DE
Outras dicas
Ficaria no construtor de consultas assim:
$class = 'Entity\File\Image';
$qb = $this->createQueryBuilder('f');
$qb->where($qb->expr()->isInstanceOf('f', $class));
Observação:que você não poderá definir a classe como parâmetro porque ela terá escape.
para PHP 5.50 e superior:
$this->createQueryBuilder('f')
->andWhere('f INSTANCE OF '.Image::class)
Como esta última versão da doutrina é suportada a consulta direta do valor do discriminador.
public function findOfType($discr)
{
$qb = $this->createQueryBuilder('e');
$qb->where('e INSTANCE OF :discr');
$qb->setParameter('discr', $discr);
return $qb->getQuery()->getResult();
}
terá uma consulta de resultado com esta cláusula:
WHERE e0_.discr IN ('discriminator_passed_to_function')
Esta extensão de doutrina foi muito útil para mim porque eu precisava acessar a classe pai e INSTANCE OF
não funciona nesse caso.
https://gist.github.com/jasonhofer/8420677
Por exemplo:Tenho a seguinte estrutura de classes:
Classe Base
Classe 1 herda de Classe Base (discriminador = c1)
Classe2 herda de Classe 1 (discriminador = c2)
Classe3 herda de Classe 1 (discriminador = c3)
Quero selecionar todas as entidades de Classe 1 mas não de Classe2 ou Classe3
SELECT c FROM \Class1 c WHERE TYPE(c) = 'c1';