Voor uw oplossing kunt u gebruik maken van COUNT(DISTINCT)
met HAVING
en GROUP BY
clausules
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();
}
In bovenstaande zoekopdracht heb ik nog een selectie toegevoegd om verschillende service-ID's voor elk hotel te tellen, d.w.z.
Dan heb ik ook een groep nodig voor die telling, dus ik heb toegevoegd
Nu komt het lastige deel, zoals je al zei, dat je een hotel nodig hebt met alle service-ID's zoals ids (1,2,3), dus hotels die deze 3 services bevatten, moeten worden geretourneerd wanneer we deze gebruiken voor prestaties of bewerkingen zoals where servid_id = 1 or servid_id = 2 servid_id = 3
wat precies is dat je de AND
. niet wilt operatie dat hotel deze 3 moet hebben, dus ik heb deze logica omgezet door een deel te hebben
Nu total_services
is een virtuele alias voor de zoekopdracht en bevat de afzonderlijke telling voor elk hotel, dus ik heb deze telling vergeleken met de telling van de verstrekte ID's in IN()
deel dit zal de hotels retourneren die deze services moeten bevatten