sql >> Databasteknik >  >> RDS >> Mysql

Doctrine QueryBuilder:ManyToOne-relation där mer än en subEntity måste matcha

Du gör det inte korrekt, du matchar etiketter och värden med de senaste filtervärdena eftersom platshållarna :label , :value som används i frågan är inte unika för varje loop-iteration, så alla satser som genereras av loop kommer att matcha med den sista etiketten och värdet.

För att få jobb vars varje egenskap matchar de medföljande filtren kan du skriva ungefär som nedanstående doktrinfråga.

Först kommer den att samla alla etiketter och värden i en separat array och sedan matchar den med egenskaperna för jobbet genom att använda IN() operation, sist för att få jobb vars egenskaper matchar alla filter du behöver för att bygga aggregering för att räkna matchningsresultaten och bör vara lika med antalet filter

$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. Ta bort en kvantitet från flera rader i en databas

  2. välj count(*) från tabellen över mysql i php

  3. Hur man gör en mysql-fulltextsökning med flera kolumner där partiella ord matchas

  4. Hur alias ett fält eller en kolumn i MySQL?