Doctrine 2 - Comment utiliser la colonne Discriminator dans la clause où
-
13-11-2019 - |
Question
J'ai été utilisé une colonne de discriminatrice dans où la clause 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 Near 'Format =' Image '': Erreur: Entités de classe File AbstractFile n'a pas de champ ou d'association nommé format"
Comment puis-je utiliser la colonne Discriminator dans la clause où?
Merci.
La solution
Je pense que tu devrais utiliser EXEMPLE DE
Autres conseils
Il ressemblerait à Query Builder comme ceci:
$class = 'Entity\File\Image';
$qb = $this->createQueryBuilder('f');
$qb->where($qb->expr()->isInstanceOf('f', $class));
Noter: que vous ne pourrez pas définir la classe en tant que paramètre car il sera échappé.
pour PHP 5,50 et plus:
$this->createQueryBuilder('f')
->andWhere('f INSTANCE OF '.Image::class)
En tant que dernière version de doctrine, il est pris en charge pour 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 en résultats avec cette clause:
WHERE e0_.discr IN ('discriminator_passed_to_function')
Cette extension de doctrine m'a été très utile car je devais 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:
Classe de base
Classe 1 hériter de Classe de base (discriminateur = C1)
Classe2 hériter de Classe 1 (discriminateur = C2)
Classe3 hériter de Classe 1 (discriminateur = C3)
Je veux sélectionner toutes les entités parmi Classe 1 mais pas de Classe2 ou Classe3
SELECT c FROM \Class1 c WHERE TYPE(c) = 'c1';