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

Doctrine QueryBuilder:ManyToOne-relation, hvor mere end én underEntity skal matche

Du gør det ikke korrekt, du matcher etiketter og værdier med de sidste filterværdier, fordi pladsholderne :label , :value brugt i forespørgslen er ikke unikke for hver loop iteration, så alle klausuler genereret af loop vil matche med den sidste etiket og værdi.

For at få de jobs, hvis hver egenskab matcher med de medfølgende filtre, kan du skrive noget som nedenstående doktrinforespørgsel.

Først samler den alle etiketter og værdier i et separat array, og derefter vil det matche med egenskaberne for jobbet ved at bruge IN() operation, til sidst for at få de job, hvis egenskaber matcher alle de filtre, du skal bruge for at opbygge aggregering for at tælle matchende resultater og bør være lig med antallet af filtre

$qb =  $this->getDoctrine()
            ->getRepository('AppBundle:Job')
            ->createQueryBuilder('job')
            ->innerJoin('job.properties','p');
$labels = array();
$values = array();
foreach($filters as $label => $value)
{
    $labels[] = $label;
    $values[] = $value;
}
$qb->addSelect('COUNT(DISTINCT  p.id) AS total_properties')
   ->andWhere('p.label IN (:labels)')
   ->andWhere('p.value IN (:values)')
   ->addGroupBy('job.id')
   ->having('total_properties = '.count($filters))
   ->setParameter('labels',$labels)
   ->setParameter('values',$values)
   ->getQuery()
   ->getResult();



  1. MySQL IF ELSEIF i udvalgt forespørgsel

  2. Hvor dårligt er det at bruge SELECT MAX(id) i MYSQL i stedet for mysql_insert_id() i PHP?

  3. NLSSORT() Funktion i Oracle

  4. Sådan optimerer du MySQL-visninger