Не го правите правилно, съпоставяте етикети и стойности с последните стойности на филтъра, защото заместващите :label
, :value
използвани в заявката не са уникални за всяка итерация на цикъл, така че всички клаузи, генерирани от цикъл, ще съвпадат с последния етикет и стойност.
За да получите заданията, чието всяко свойство съвпада с предоставените филтри, можете да напишете нещо като заявката за доктрината по-долу.
Първо ще събере всички етикети и стойности в отделен масив и след това ще съвпадне със свойствата на заданието чрез IN()
операция, накрая, за да получите заданията, чиито свойства съвпадат с всички филтри, от които се нуждаете, за да изградите агрегиране, за да преброите съвпадащите резултати и трябва да бъде равно на броя на филтрите
$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();