DOTTRINE 2 - Come utilizzare la colonna Discriminator in cui la clausola
-
13-11-2019 - |
Domanda
Sono stato usato la colonna discriminatrice in cui la clausola come questa:
//f = root entity
$qb = $this->createQueryBuilder('f');
$qb->add('where', 'f.format = \'image\' OR f.format = \'text\'');
.
Ho un errore: "Messaggio: [Errore semantico] Linea 0, Col 73 Vicino 'format=' Image '' Image '' Errore: Entità di classe \ File \ AbstractFile non ha alcun campo o associazione denominata formato" Come posso utilizzare la colonna Discriminator in cui la clausola?
Grazie.
Soluzione
Penso che dovresti usare istanza di
Altri suggerimenti
Guarderebbe in Query Builder come questo:
$class = 'Entity\File\Image';
$qb = $this->createQueryBuilder('f');
$qb->where($qb->expr()->isInstanceOf('f', $class));
.
Nota : che non sarai in grado di impostare la classe come parametro perché verrà sfuggito.
per PHP 5.50 e sopra:
$this->createQueryBuilder('f')
->andWhere('f INSTANCE OF '.Image::class)
. Come questa ultima versione di dottrina è supportato per interrogare direttamente il valore discriminatore.
public function findOfType($discr)
{
$qb = $this->createQueryBuilder('e');
$qb->where('e INSTANCE OF :discr');
$qb->setParameter('discr', $discr);
return $qb->getQuery()->getResult();
}
.
Avrà una query dei risultati con questa clausola:
WHERE e0_.discr IN ('discriminator_passed_to_function')
. Questa estensione di dottrina è stata molto utile per me perché avevo bisogno di accedere alla categoria madre e INSTANCE OF
non funziona in tal caso.
https://gist.github.com/jasonhofer/8420677
Ad esempio: ho la seguente struttura di classe:
Baseclass
Class1 Eredita da BaseClass (Discriminator= C1)
class2 eredita da class1 (discriminator= c2)
class3 eredita da class1 (discriminator= c3)
Voglio selezionare tutte le entità da Class1 ma non da Class2 o Class3
.SELECT c FROM \Class1 c WHERE TYPE(c) = 'c1';