Untuk solusi Anda, Anda dapat menggunakan COUNT(DISTINCT)
dengan HAVING
dan GROUP BY
klausa
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();
}
Dalam kueri di atas saya telah menambahkan satu pilihan lagi sebagai penghitungan id layanan yang berbeda untuk setiap hotel yaitu
Kemudian saya juga membutuhkan grup untuk jumlah itu jadi saya menambahkan
Sekarang inilah bagian yang sulit seperti yang Anda sebutkan bahwa Anda memerlukan hotel yang memiliki semua id layanan seperti id (1,2,3) sehingga hotel yang berisi 3 layanan ini harus dikembalikan ketika kami menggunakan dalam kinerja atau operasinya seperti where servid_id = 1 or servid_id = 2 servid_id = 3
yang sebenarnya Anda tidak inginkan AND
operasi hotel itu harus memiliki 3 ini jadi saya mengubah logika ini dengan memiliki bagian
Sekarang total_services
adalah alias virtual untuk kueri dan menyimpan jumlah yang berbeda untuk setiap hotel, jadi saya telah membandingkan jumlah ini dengan jumlah id yang disediakan di IN()
bagian ini akan mengembalikan hotel yang harus berisi layanan ini