web-dev-qa-db-fra.com

Doctrine 2 - Comment utiliser la colonne discriminante dans la clause where

J'ai été utilisé colonne discriminant dans où clause comme ceci:

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

J'ai un message d'erreur: "Message: [Erreur sémantique] ligne 0, col 73 près de 'format =' image '': Erreur: Le fichier Entities\File\AbstractFile n'a pas de format ni de nom de l'association"

Comment puis-je utiliser la colonne discriminante dans la clause where?

Merci.

33
Can Aydoğan

Je pense que vous devriez utiliser INSTANCE OF

56
Koc

Cela ressemblerait dans le constructeur de requête comme ceci:

$class = 'Entity\File\Image';

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

Remarque : vous ne pourrez pas définir la classe en tant que paramètre car elle sera échappée.

8
Aistis

pour PHP 5.50 et plus:

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

Cette extension de doctrine m'a été très utile car j'avais besoin d'accéder à la classe parente et INSTANCE OF ne fonctionne pas dans ce cas.

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

Par exemple: j'ai la structure de classe suivante:

BaseClass  

Class1 hérite de BaseClass (discriminateur = c1)

Class2 hérite de Class1 (discriminateur = c2)

Class3 hérite de Class1 (discriminateur = c3)

Je veux sélectionner toutes les entités de Class1 mais pas de Class2 ou Class3

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

En tant que cette dernière version de doctrine, il est supporté pour interroger directement la valeur de discriminateur.

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

aura une requête de résultat avec cette clause:

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