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();