Mysql
 sql >> Database >  >> RDS >> Mysql

Symfony2 - Doctrine2 QueryBuilder DOVE NEL campo ManyToMany

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

GROUP BY and HAVING Clause