学说2 - 如何在where子句中使用discriminator列

时间:2011-05-13 07:27:07

标签: php doctrine-orm dql discriminator

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

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

我有一个错误:“消息:[语义错误]第0行,第73行靠近'format ='image'':错误:类实体\文件\ AbstractFile没有字段或关联命名格式”

我如何在where子句中使用discriminator列?

感谢。

5 个答案:

答案 0 :(得分:57)

我认为您应该使用INSTANCE OF

答案 1 :(得分:10)

它会在查询构建器中查找:

$class = 'Entity\File\Image';

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

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

答案 2 :(得分:3)

对于PHP 5.50及以上版本:

$this->createQueryBuilder('f')
        ->andWhere('f INSTANCE OF '.Image::class)

答案 3 :(得分:0)

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

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')

答案 4 :(得分:0)

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

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

例如:我有以下类结构:

BaseClass

Class1 继承自 BaseClass (discriminator = c1)

Class2 继承自 Class1 (discriminator = c2)

Class3 继承自 Class1 (discriminator = c3)

我想从 Class1 中选择所有实体,但不要从 Class2 Class3

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