Doctrine 2 – Как использовать столбец дискриминатора в разделе where

Я использовал столбец дискриминатора в том месте, где:

//f = root entity $qb = $this->createQueryBuilder('f'); $qb->add('where', 'f.format = \'image\' OR f.format = \'text\''); 

У меня есть сообщение об ошибке: «Сообщение: [Семантическая ошибка]] 0, col 73 near 'format =' image '': Ошибка: объекты класса \ File \ AbstractFile не имеют поля или ассоциации с именем format"

Как я могу использовать столбец дискриминатора в разделе where?

Благодарю.

Я думаю, что вы должны использовать INSTANCE OF

Он будет выглядеть в построителе запросов следующим образом:

 $class = 'Entity\File\Image'; $qb = $this->createQueryBuilder('f'); $qb->where($qb->expr()->isInstanceOf('f', $class)); 

Обратите внимание : вы не сможете установить класс в качестве параметра, потому что он будет экранирован.

для PHP 5.50 и выше:

 $this->createQueryBuilder('f') ->andWhere('f INSTANCE OF '.Image::class) 

В качестве последней версии доктрины поддерживается непосредственный запрос значения дискриминатора.

 public function findOfType($discr) { $qb = $this->createQueryBuilder('e'); $qb->where('e INSTANCE OF :discr'); $qb->setParameter('discr', $discr); return $qb->getQuery()->getResult(); } 

будет иметь запрос результата с этим пунктом:

 WHERE e0_.discr IN ('discriminator_passed_to_function') 

Это расширение доктрины было очень полезно для меня, потому что мне нужно было получить доступ к родительскому классу, а INSTANCE OF в этом случае не работает.

https://gist.github.com/jasonhofer/8420677

Например: у меня есть следующая структура классов:

BaseClass

Класс1 наследуется от BaseClass (дискриминатор = c1)

Класс2 наследует Class1 (дискриминатор = c2)

Класс 3 наследует Class1 (дискриминатор = c3)

Я хочу выбрать все объекты из Class1, но не из Class2 или Class3

 SELECT c FROM \Class1 c WHERE TYPE(c) = 'c1';