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.
Je pense que vous devriez utiliser INSTANCE OF
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.
pour PHP 5.50 et plus:
$this->createQueryBuilder('f')
->andWhere('f INSTANCE OF '.Image::class)
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';
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')