it-swarm.com.de

Lehre 2 - Wie man eine Unterscheidungsspalte in der where-Klausel benutzt

Ich wurde in der folgenden where-Klausel als Unterscheidungsmerkmal verwendet:

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

Ich habe einen Fehler: "Meldung: [Semantischer Fehler] Zeile 0, Spalte 73 in der Nähe von 'format =' image '': Fehler: Class Entities\File\AbstractFile hat kein Feld oder Zuordnung namens format"

Wie kann ich eine Unterscheidungsspalte in der where-Klausel verwenden?

Vielen Dank.

33
Can Aydoğan

Ich denke, dass Sie INSTANCE OF verwenden sollten

56
Koc

In Query Builder würde das so aussehen:

$class = 'Entity\File\Image';

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

Hinweis : Sie können die Klasse nicht als Parameter festlegen, da sie maskiert wird.

8
Aistis

für PHP 5.50 und höher:

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

Diese Doktrinenerweiterung war für mich sehr nützlich, da ich auf die übergeordnete Klasse zugreifen musste und INSTANCE OF in diesem Fall nicht funktioniert.

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

Zum Beispiel: Ich habe folgende Klassenstruktur:

BaseClass

Class1 erbt von BaseClass (Diskriminator = c1)

Klasse2 erbt von Klasse1 (Diskriminator = c2)

Klasse3 erbt von Klasse1 (Diskriminator = c3)

Ich möchte alle Entitäten aus Klasse1 auswählen, aber nicht aus Klasse2 oder Klasse3

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

Als neueste Doktrinversion wird es unterstützt, den Diskriminatorwert direkt abzufragen.

public function findOfType($discr)
    {
        $qb = $this->createQueryBuilder('e');
        $qb->where('e INSTANCE OF :discr');
        $qb->setParameter('discr', $discr);
        return $qb->getQuery()->getResult();
    }

wird eine Ergebnisabfrage mit dieser Klausel haben:

WHERE e0_.discr IN ('discriminator_passed_to_function')
0
Leggy7