46 votes

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

J'ai utilisé la colonne discriminante dans la clause where comme ceci :

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

J'ai une erreur : "Message : [Erreur sémantique] ligne 0, col 73 près de 'format = 'image'' : Error : Classe Entités \File\AbstractFile n'a pas de champ ou d'association nommé format"

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

Merci.

75voto

Koc Points 1342

Je pense que vous devriez utiliser INSTANCE DE

14 votes

Plus précisément $db->andWhere('f INSTANCE OF Entity \File\Image ')

2 votes

Vous pouvez également utiliser les clés de la carte de discrimination au lieu du nom de la classe d'entité.

6 votes

Si vous utilisez un caractère de remplacement (par exemple, 'f INSTANCE OF :type' ), vous devez définir le paramètre comme suit : $query->setParameter('type', $em->getClassMetadata('Entity\File\Image'))

15voto

Aistis Points 1693

Dans le constructeur de requêtes, cela ressemblerait à ceci :

$class = 'Entity\File\Image';

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

Note Il n'est pas possible de définir la classe en tant que paramètre car elle sera échappée.

4voto

Andrew Atkinson Points 556

Pour PHP 5.50 et plus :

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

4voto

Leggy7 Points 258

Cette dernière version de la doctrine permet d'interroger directement la valeur du 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')

1voto

Ragnar Points 896

Cette extension de doctrine m'a été très utile car j'avais besoin d'accéder à la classe parent 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

Classe 1 hérite de BaseClass (discriminateur = c1)

Classe 2 hérite de Classe 1 (discriminateur = c2)

Classe 3 hérite de Classe 1 (discriminateur = c3)

Je veux sélectionner toutes les entités de Classe 1 mais pas de Classe 2 o Classe 3

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X