プレースホルダー:label
が原因で、ラベルと値を最後のフィルター値と一致させているため、正しく実行されていません。 、:value
クエリで使用されるのはループの反復ごとに一意ではないため、ループによって生成されるすべての句は最後のラベルと値と一致します。
各プロパティが提供されたフィルターと一致するジョブを取得するには、以下のドクトリンクエリのように記述できます。
まず、すべてのラベルと値を別々の配列に収集し、次にIN()
を使用してジョブのプロパティと照合します。 最後に、プロパティがすべてのフィルターに一致するジョブを取得するには、一致する結果をカウントするために集計を作成する必要があり、フィルターの数と同じである必要があります
$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();