За вашето решение можете да използвате 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()
част това ще върне хотелите, които трябва да съдържат тези услуги