अपने समाधान के लिए आप COUNT(DISTINCT)
. का उपयोग कर सकते हैं HAVING
. के साथ और GROUP BY
खंड
public function findByServices($services)
{
$qb = $this->createQueryBuilder('hotel')
->addSelect('location')
->addSelect('country')
->addSelect('billing')
->addSelect('services')
->addSelect('COUNT(DISTINCT services.id) AS total_services')
->innerJoin('hotel.billing', 'billing')
->innerJoin('hotel.location', 'location')
->innerJoin('location.city', 'city')
->innerJoin('location.country', 'country')
->innerJoin('hotel.services', 'services');
$i = 0;
$arrayIds = array();
foreach ($services as $service) {
$arrayIds[$i++] = $service->getId();
}
$qb->add('where', $qb->expr()->in('services', $arrayIds))
->addGroupBy('hotel.id')
->having('total_services = '.count($arrayIds))
->getQuery();
}
उपरोक्त क्वेरी में मैंने प्रत्येक होटल के लिए अलग-अलग सेवा आईडी की गिनती के रूप में एक और चयन जोड़ा है, अर्थात
फिर मुझे उस गिनती के लिए एक समूह की भी आवश्यकता है इसलिए मैंने जोड़ा
अब यहां मुश्किल हिस्सा आता है जैसा कि आपने उल्लेख किया है कि आपको ऐसे होटल की आवश्यकता है जिसमें आईडी (1,2,3) जैसी सभी सेवा आईडी हों, इसलिए जब हम इसके प्रदर्शन या संचालन में उपयोग करते हैं तो इन 3 सेवाओं वाले होटलों को वापस कर दिया जाना चाहिए जैसे where servid_id = 1 or servid_id = 2 servid_id = 3
जो वास्तव में आप नहीं चाहते AND
ऑपरेशन कि होटल में ये 3 होने चाहिए इसलिए मैंने इस तर्क को भाग
अब total_services
क्वेरी के लिए वर्चुअल उपनाम है और प्रत्येक होटल के लिए अलग-अलग गिनती रखता है इसलिए मैंने इस गिनती की तुलना IN()
में प्रदान की गई आईडी की गिनती से की है भाग यह उन होटलों को लौटा देगा जिनमें ये सेवाएं शामिल होनी चाहिए