私はこのような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句で識別子列を使用するにはどうすればよいですか?
ありがとう。
INSTANCE OF を使用する必要があると思います
次のようにクエリビルダーで調べます。
$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)
この最新の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')
このdoctrine拡張機能は、親クラスにアクセスする必要があり、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';