Bạn thực hiện không đúng cách, bạn đang khớp các nhãn và giá trị với các giá trị bộ lọc cuối cùng bởi vì trình giữ chỗ :label
, :value
được sử dụng trong truy vấn không phải là duy nhất cho mỗi lần lặp vòng lặp, vì vậy tất cả các mệnh đề được tạo bởi vòng lặp sẽ khớp với nhãn và giá trị cuối cùng.
Để nhận các công việc có mỗi thuộc tính khớp với các bộ lọc được cung cấp, bạn có thể viết phần nào giống như truy vấn học thuyết bên dưới.
Đầu tiên, nó sẽ thu thập tất cả các nhãn và giá trị trong mảng riêng biệt và sau đó nó sẽ khớp với các thuộc tính của công việc bằng cách sử dụng IN()
hoạt động, cuối cùng để nhận các công việc có thuộc tính khớp với tất cả các bộ lọc mà bạn cần tạo tổng hợp để đếm các kết quả phù hợp và phải bằng số bộ lọc
$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();