我正在尝试在有实体的地方进行查询Job
和一个实体JobProperty
其中 1Job
可以有很多JobProperties
.
使用 Doctrine 和 Symfony2 查询多对多关系 https://stackoverflow.com/questions/26549120/query-on-a-many-to-many-relationship-using-doctrine-with-symfony2解释如何根据一个实体的子实体的值检索该实体的匹配项。由此我构建了查询:
$qb = $this->getDoctrine()->getRepository('AppBundle:Job')->createQueryBuilder('job')
->innerJoin('job.properties','property');
foreach($filters as $label => $value)
{
$qb->andWhere('property.label = :label AND property.value = :value')
->setParameter('label',$label)
->setParameter('value',$value);
}
上面的查询在一定程度上有效,但它提供属性与任何过滤器匹配的结果,而不仅仅提供所有过滤器匹配的结果。我需要它只返回所有过滤器都匹配的结果。
我可能必须以不同的方式解决这个问题,但我不确定我是否会实施。
您没有正确执行此操作,您将标签和值与最后一个过滤器值相匹配,因为占位符: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();
这是另一个与您的问题类似的答案作为参考Symfony2 - Doctrine2 QueryBuilder WHERE IN ManyToMany field https://stackoverflow.com/questions/25576818/symfony2-doctrine2-querybuilder-where-in-manytomany-field/25577184#25577184
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)