Доктрина 2 - Как использовать столбец дискриминатора в предложении where - PullRequest
34 голосов
/ 13 мая 2011

Я использовал столбец дискриминатора в выражении 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 не имеет поля или ассоциации с именованным форматом "

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

Спасибо.

Ответы [ 5 ]

57 голосов
/ 13 мая 2011

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

10 голосов
/ 08 декабря 2015

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

$class = 'Entity\File\Image';

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

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

3 голосов
/ 31 января 2017

для PHP 5.50 и выше:

$this->createQueryBuilder('f')
        ->andWhere('f INSTANCE OF '.Image::class)
1 голос
/ 24 июля 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')
0 голосов
/ 25 октября 2017

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

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

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

BaseClass

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

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

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

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

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