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

Я использовал столбец дискриминатора в предложении where следующим образом:

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

У меня есть ошибка: «Сообщение: [Семантическая ошибка] строка 0, столбец 73 рядом с 'format =' image '': Ошибка: Class Entities \ File \ AbstractFile не имеет поля или ассоциации с именем format»

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

Спасибо.


person Can Aydoğan    schedule 13.05.2011    source источник
comment
Вы должны иметь возможность использовать case when и INSTANCE OF - см. Мой ответ здесь: stackoverflow.com/a/59690590/645042   -  person Sam Critchley    schedule 11.01.2020


Ответы (5)


Я думаю, вам следует использовать ЭКЗАМЕН

person Koc    schedule 13.05.2011
comment
В частности, $ db- ›andWhere ('f ЭКЗЕМПЛЯР Entity \ File \ Image') - person gawpertron; 29.11.2011
comment
Вы также можете использовать ключи карты дискриминатора вместо имени класса сущности. - person Pavel Petrov; 26.03.2014
comment
Если вы используете заполнитель (например, 'f INSTANCE OF :type'), вам необходимо установить параметр следующим образом: $query->setParameter('type', $em->getClassMetadata('Entity\File\Image')) - person Leukipp; 08.06.2015
comment
6 лет спустя ... все еще спасает жизнь! - person Alex Tartan; 29.09.2017
comment
7 лет спустя ... все еще спасает жизнь! - person John Tribe; 14.06.2018

В конструкторе запросов это выглядело бы так:

$class = 'Entity\File\Image';

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

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

person Aistis    schedule 08.12.2015

для PHP 5.50 и выше:

$this->createQueryBuilder('f')
        ->andWhere('f INSTANCE OF '.Image::class)
person Andrew Atkinson    schedule 31.01.2017

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

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')
person Leggy7    schedule 24.07.2017

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

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

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

BaseClass

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

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

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

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

SELECT c FROM \Class1 c WHERE TYPE(c) = 'c1';
person Ragnar    schedule 25.10.2017