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