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

Symfony2 - Doctrine2 QueryBuilder WHERE IN ManyToMany-feltet

Til din løsning kan du gøre brug af COUNT(DISTINCT) med HAVING og GROUP BY klausuler

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();
}

I ovenstående forespørgsel har jeg tilføjet endnu et udvalg som tæller forskellige service-id'er for hvert hotel, dvs.

Så har jeg også brug for en gruppe for at tælle, så jeg tilføjede

Her kommer nu den vanskelige del, som du nævnte, at du har brug for et hotel, der har alle service-id'erne som id'er (1,2,3), så hoteller, der indeholder disse 3 tjenester, skal returneres, når vi bruger det i udførelsen eller operationen som where servid_id = 1 or servid_id = 2 servid_id = 3 hvilket er præcis du ikke vil have AND operation, at hotellet skal have disse 3, så jeg konverterede denne logik ved at have en del

Nu total_services er et virtuelt alias for forespørgslen og indeholder det særskilte antal for hvert hotel, så jeg har sammenlignet dette antal med antallet af angivne id'er i IN() del dette vil returnere de hoteller, som skal indeholde disse tjenester

GROUP BY and HAVING Clause




  1. MySQL – Forskellige metoder til at kende nuværende bruger

  2. Brug af INSERT INTO fra SQL Server til at ændre Salesforce-data

  3. IN-klausul i mysql nodejs

  4. Sådan opretter du en tabel med flere fremmednøgler og ikke bliver forvirret