42

我在 where 子句中使用了鉴别器列,如下所示:

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

我有一个错误:“消息:[Semantical Error] line 0, col 73 near 'format = 'image'': Error: Class Entities\File\AbstractFile has no field or association named format”

如何在 where 子句中使用鉴别器列?

谢谢。

4

6 回答 6

67

我认为你应该使用INSTANCE OF

于 2011-05-13T13:05:19.610 回答
13

它会在查询生成器中看起来像这样:

$class = 'Entity\File\Image';

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

注意:您将无法将类设置为参数,因为它将被转义。

于 2015-12-08T13:06:57.840 回答
4

PHP 5.50 及以上版本:

$this->createQueryBuilder('f')
        ->andWhere('f INSTANCE OF '.Image::class)
于 2017-01-31T12:49:18.890 回答
3

作为这个最新的学说版本,它支持直接查询鉴别器值。

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')
于 2017-07-24T10:06:48.950 回答
1

这个原则扩展对我来说非常有用,因为我需要访问父类并且INSTANCE OF在这种情况下不起作用。

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

例如:我有以下类结构:

基类

Class1继承自BaseClass (discriminator = c1)

Class2继承自Class1 (鉴别器 = c2)

Class3继承自Class1 (discriminator = c3)

我想从Class1中选择所有实体,但不是从Class2Class3中选择

SELECT c FROM \Class1 c WHERE TYPE(c) = 'c1';
于 2017-10-25T17:31:43.270 回答
0

一切你需要的:

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()
            ;
于 2022-02-23T17:00:07.250 回答