Mysql
 sql >> база данни >  >> RDS >> Mysql

Doctrine QueryBuilder:Връзка ManyToOne, където трябва да съвпадат повече от едно подсъщност

Не го правите правилно, съпоставяте етикети и стойности с последните стойности на филтъра, защото заместващите :label , :value използвани в заявката не са уникални за всяка итерация на цикъл, така че всички клаузи, генерирани от цикъл, ще съвпадат с последния етикет и стойност.

За да получите заданията, чието всяко свойство съвпада с предоставените филтри, можете да напишете нещо като заявката за доктрината по-долу.

Първо ще събере всички етикети и стойности в отделен масив и след това ще съвпадне със свойствата на заданието чрез IN() операция, накрая, за да получите заданията, чиито свойства съвпадат с всички филтри, от които се нуждаете, за да изградите агрегиране, за да преброите съвпадащите резултати и трябва да бъде равно на броя на филтрите

$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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Инструкция InnoDB SELECT ... FOR UPDATE, заключваща всички редове в таблица

  2. Как да променя дефиницията на колоната на MySQL?

  3. Плъзгаща се средна - MySQL

  4. Предайте параметрите на MySQL скрипта

  5. mysql/php това защитен начин за свързване с mysql DB ли е?