Neděláte to správně, porovnáváte štítky a hodnoty s posledními hodnotami filtru, protože zástupné symboly :label
, :value
použité v dotazu nejsou jedinečné pro každou iteraci smyčky, takže všechny klauzule generované smyčkou se budou shodovat s posledním štítkem a hodnotou.
Chcete-li získat úlohy, jejichž každá vlastnost odpovídá poskytnutým filtrům, můžete napsat něco jako dotaz na doktrínu níže.
Nejprve shromáždí všechny štítky a hodnoty do samostatného pole a poté se pomocí IN()
přiřadí k vlastnostem úlohy operaci, nakonec získáte úlohy, jejichž vlastnosti odpovídají všem filtrům, které potřebujete k vytvoření agregace pro počítání odpovídajících výsledků a měla by se rovnat počtu filtrů
$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();