Per la tua soluzione puoi utilizzare COUNT(DISTINCT)
con HAVING
e GROUP BY
clausole
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();
}
Nella query precedente ho aggiunto un'altra selezione per contare gli ID servizio distinti per ciascun hotel, ad esempio
Quindi ho anche bisogno di un gruppo per quel conteggio, quindi ho aggiunto
Ora ecco che arriva la parte difficile come hai detto che hai bisogno di un hotel che abbia tutti gli ID servizio come ID (1,2,3), quindi gli hotel che contengono questi 3 servizi dovrebbero essere restituiti quando usiamo nelle sue prestazioni o operazioni come where servid_id = 1 or servid_id = 2 servid_id = 3
che è esattamente che non vuoi il AND
operazione che l'hotel deve avere questi 3 così ho convertito questa logica avendo parte
Ora total_services
è un alias virtuale per la query e contiene il conteggio distinto per ogni hotel, quindi ho confrontato questo conteggio con il conteggio degli ID forniti in IN()
parte questo restituirà gli hotel che devono contenere questi servizi