Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Doctrine QueryBuilder:Relacja ManyToOne, w której musi pasować więcej niż jeden podEntity

Nie robisz tego poprawnie, dopasowujesz etykiety i wartości do ostatnich wartości filtra, ponieważ symbole zastępcze :label , :value użyte w zapytaniu nie są unikalne dla każdej iteracji pętli, więc wszystkie klauzule generowane przez pętlę będą pasować do ostatniej etykiety i wartości.

Aby uzyskać oferty pracy, których każda właściwość pasuje do dostarczonych filtrów, możesz napisać podobnie jak poniżej zapytanie doktryny.

Najpierw zbierze wszystkie etykiety i wartości w osobnej tablicy, a następnie dopasuje się do właściwości zadania za pomocą IN() operacja, w końcu, aby uzyskać zadania, których właściwości pasują do wszystkich filtrów potrzebnych do zbudowania agregacji, aby zliczyć pasujące wyniki i powinna być równa liczbie filtrów

$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. Składnia MySQL dla Dołącz do aktualizacji

  2. Potrzebujesz wyjaśnienia PHP PDO ....!

  3. Wyzwalacz nie rozpoznaje tabeli (wyzwalacz, aby podzielić zawartość NEW.values ​​na wiele wierszy w celu wstawienia do innej tabeli)

  4. wiele funkcji to jedna wielka funkcja w PHP?

  5. PHP MYSQL -> Wyświetl daty zapisane jako typ „data” z bazy danych MYSQL