Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Doctrine QueryBuilder:Relacionamento ManyToOne onde mais de uma subEntidade deve corresponder


Você não está fazendo isso corretamente, você está combinando rótulos e valores com os últimos valores de filtro porque os espaços reservados :label , :value usados ​​na consulta não são exclusivos para cada iteração do loop, portanto, todas as cláusulas geradas pelo loop corresponderão ao último rótulo e valor.

Para obter os trabalhos cujas propriedades correspondem aos filtros fornecidos, você pode escrever algo como a consulta de doutrina abaixo.

Primeiro, ele coletará todos os rótulos e valores em uma matriz separada e, em seguida, combinará com as propriedades do trabalho usando IN() operação, por último para obter os trabalhos cujas propriedades correspondem a todos os filtros, você precisa criar agregação para contar os resultados correspondentes e deve ser igual à contagem 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();