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

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

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

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

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

Благодарю.

6 ответов

Решение

Я думаю, что вы должны использовать МОМЕНТ

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

$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

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

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

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

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

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

Все, что тебе нужно:

      return $this->createQueryBuilder('entity')
            ->andWhere('entity.field = :field')
            ->leftJoin('entity.entity2', 'entity2')
            ->andWhere('entity2 INSTANCE OF :type')
            ->setParameter('field', 'value')
            ->setParameter('type', $this->getEntityManager()->getClassMetadata(Entity2::class))
            ->getQuery()
            ->getResult()
            ;
Другие вопросы по тегам