Til din løsning kan du gøre brug af COUNT(DISTINCT)
med HAVING
og GROUP BY
klausuler
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();
}
I ovenstående forespørgsel har jeg tilføjet endnu et udvalg som tæller forskellige service-id'er for hvert hotel, dvs.
Så har jeg også brug for en gruppe for at tælle, så jeg tilføjede
Her kommer nu den vanskelige del, som du nævnte, at du har brug for et hotel, der har alle service-id'erne som id'er (1,2,3), så hoteller, der indeholder disse 3 tjenester, skal returneres, når vi bruger det i udførelsen eller operationen som where servid_id = 1 or servid_id = 2 servid_id = 3
hvilket er præcis du ikke vil have AND
operation, at hotellet skal have disse 3, så jeg konverterede denne logik ved at have en del
Nu total_services
er et virtuelt alias for forespørgslen og indeholder det særskilte antal for hvert hotel, så jeg har sammenlignet dette antal med antallet af angivne id'er i IN()
del dette vil returnere de hoteller, som skal indeholde disse tjenester