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 fieldorassociationという名前のformat」

where句で識別子列を使用するにはどうすればよいですか?

ありがとう。

4

6 に答える 6

67

INSTANCEOFを使うべきだと思います

于 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

例:次のクラス構造があります。

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';
于 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 に答える