ソリューションには、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();
}
上記のクエリでは、ホテルごとに個別のサービスIDをカウントするために、もう1つselectを追加しました。つまり
次に、そのカウントのグループ化も必要なので、
を追加しました
ここで、ID(1,2,3)などのすべてのサービスIDを持つホテルが必要であると述べたように、注意が必要な部分があります。したがって、これら3つのサービスを含むホテルは、where servid_id = 1 or servid_id = 2 servid_id = 3
これはまさにあなたがAND
を望まないということです ホテルがこれらの3つを持っている必要があるという操作なので、私はパートを持ってこのロジックを変換しました
今total_services
はクエリの仮想エイリアスであり、ホテルごとに異なるカウントを保持しているため、このカウントをIN()
で提供されたIDのカウントと比較しました。 一部これは、これらのサービスを含まなければならないホテルを返します