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.

Foi útil?

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';
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top