Du gør det ikke korrekt, du matcher etiketter og værdier med de sidste filterværdier, fordi pladsholderne :label
, :value
brugt i forespørgslen er ikke unikke for hver loop iteration, så alle klausuler genereret af loop vil matche med den sidste etiket og værdi.
For at få de jobs, hvis hver egenskab matcher med de medfølgende filtre, kan du skrive noget som nedenstående doktrinforespørgsel.
Først samler den alle etiketter og værdier i et separat array, og derefter vil det matche med egenskaberne for jobbet ved at bruge IN()
operation, til sidst for at få de job, hvis egenskaber matcher alle de filtre, du skal bruge for at opbygge aggregering for at tælle matchende resultater og bør være lig med antallet af filtre
$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();