Du gör det inte korrekt, du matchar etiketter och värden med de senaste filtervärdena eftersom platshållarna :label
, :value
som används i frågan är inte unika för varje loop-iteration, så alla satser som genereras av loop kommer att matcha med den sista etiketten och värdet.
För att få jobb vars varje egenskap matchar de medföljande filtren kan du skriva ungefär som nedanstående doktrinfråga.
Först kommer den att samla alla etiketter och värden i en separat array och sedan matchar den med egenskaperna för jobbet genom att använda IN()
operation, sist för att få jobb vars egenskaper matchar alla filter du behöver för att bygga aggregering för att räkna matchningsresultaten och bör vara lika med antalet filter
$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();