Mysql
 sql >> Base de données >  >> RDS >> Mysql

Doctrine QueryBuilder :relation ManyToOne où plusieurs sous-entités doivent correspondre

Vous ne le faites pas correctement, vous faites correspondre les étiquettes et les valeurs avec les dernières valeurs de filtre car les espaces réservés :label , :value utilisés dans la requête ne sont pas uniques pour chaque itération de boucle, donc toutes les clauses générées par la boucle correspondront à la dernière étiquette et valeur.

Pour obtenir les emplois dont chaque propriété correspond aux filtres fournis, vous pouvez écrire un peu comme la requête de doctrine ci-dessous.

Tout d'abord, il collectera toutes les étiquettes et valeurs dans un tableau séparé, puis il correspondra aux propriétés du travail en utilisant IN() opération, en dernier lieu pour obtenir les travaux dont les propriétés correspondent à tous les filtres dont vous avez besoin pour créer une agrégation pour compter les résultats correspondants et doit être égal au nombre de filtres

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