Anda tidak melakukannya dengan benar, Anda mencocokkan label dan nilai dengan nilai filter terakhir karena placeholder :label
, :value
yang digunakan dalam kueri tidak unik untuk setiap iterasi loop, jadi semua klausa yang dihasilkan oleh loop akan cocok dengan label dan nilai terakhir.
Untuk mendapatkan pekerjaan yang masing-masing propertinya cocok dengan filter yang disediakan, Anda dapat menulis seperti kueri doktrin di bawah ini.
Pertama itu akan mengumpulkan semua label dan nilai dalam array terpisah dan kemudian akan cocok dengan properti pekerjaan dengan menggunakan IN()
operasi, terakhir untuk mendapatkan pekerjaan yang propertinya cocok dengan semua filter, Anda perlu membangun agregasi untuk menghitung hasil yang cocok dan harus sama dengan jumlah 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();