Mysql
 sql >> Database >  >> RDS >> Mysql

Doctrine QueryBuilder:relazione ManyToOne in cui più di una sottoentità deve corrispondere

Non lo stai facendo correttamente stai abbinando etichette e valori con gli ultimi valori di filtro perché i segnaposto :label , :value utilizzati nella query non sono univoci per ogni iterazione del ciclo, quindi tutte le clausole generate dal ciclo corrisponderanno all'ultima etichetta e valore.

Per ottenere i lavori le cui proprietà corrispondono ai filtri forniti, puoi scrivere un po' come sotto la query della dottrina.

Per prima cosa raccoglierà tutte le etichette e i valori in un array separato e quindi corrisponderà alle proprietà del lavoro utilizzando IN() operazione, infine per ottenere i lavori le cui proprietà corrispondono a tutti i filtri è necessario creare un'aggregazione per contare i risultati corrispondenti e dovrebbero essere uguali al conteggio dei filtri

$qb =  $this->getDoctrine()
            ->getRepository('AppBundle:Job')
            ->createQueryBuilder('job')
            ->innerJoin('job.properties','p');
$labels = array();
$values = array();
foreach($filters as $label => $value)
{
    $labels[] = $label;
    $values[] = $value;
}
$qb->addSelect('COUNT(DISTINCT  p.id) AS total_properties')
   ->andWhere('p.label IN (:labels)')
   ->andWhere('p.value IN (:values)')
   ->addGroupBy('job.id')
   ->having('total_properties = '.count($filters))
   ->setParameter('labels',$labels)
   ->setParameter('values',$values)
   ->getQuery()
   ->getResult();