web-dev-qa-db-ja.com

Doctrine 2-where句で識別子列を使用する方法

私はこのような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句で識別子列を使用するにはどうすればよいですか?

ありがとう。

38
Can Aydoğan

INSTANCE OF を使用する必要があると思います

62
Koc

次のようにクエリビルダーで調べます。

$class = 'Entity\File\Image';

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

:エスケープされるため、クラスをパラメーターとして設定することはできません。

11
Aistis

PHP 5.50以上の場合:

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

この最新のdoctrineバージョンとして、弁別子の値を直接クエリすることがサポートされています。

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

このdoctrine拡張機能は、親クラスにアクセスする必要があり、INSTANCE OFはその場合機能しません。

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

たとえば、次のクラス構造があります。

BaseClass

Class1BaseClassから継承します(discriminator = c1)

Class2Class1(discriminator = c2)から継承します

Class3Class1から継承します(discriminator = c3)

Class1からすべてのエンティティを選択したいが、Class2またはClass3

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