आप इसे सही ढंग से नहीं कर रहे हैं आप अंतिम फ़िल्टर मानों के साथ लेबल और मानों का मिलान कर रहे हैं क्योंकि प्लेसहोल्डर :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();