Ответ 1
Я думаю, что вы должны использовать INSTANCE OF
Я использовал столбец дискриминатора в том месте, где:
//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 не имеют поля или ассоциации с именем формата"
Как я могу использовать столбец дискриминатора в разделе 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';