sql >> Base de Datos >  >> RDS >> Mysql

Doctrine QueryBuilder:relación ManyToOne donde más de una subentidad debe coincidir

No lo está haciendo correctamente, está haciendo coincidir etiquetas y valores con los últimos valores de filtro porque los marcadores de posición :label , :value utilizados en la consulta no son únicos para cada iteración del bucle, por lo que todas las cláusulas generadas por el bucle coincidirán con la última etiqueta y valor.

Para obtener los trabajos cuyas propiedades coinciden con los filtros provistos, puede escribir algo como la siguiente consulta de doctrina.

Primero recopilará todas las etiquetas y valores en una matriz separada y luego coincidirá con las propiedades del trabajo usando IN() operación, en último lugar, para obtener los trabajos cuyas propiedades coincidan con todos los filtros que necesita para crear una agregación para contar los resultados coincidentes y debe ser igual al recuento de filtros

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