Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 条令QueryBuilder:多个子实体必须匹配的多个关系_Php_Mysql_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

Php 条令QueryBuilder:多个子实体必须匹配的多个关系

Php 条令QueryBuilder:多个子实体必须匹配的多个关系,php,mysql,symfony,doctrine-orm,doctrine,Php,Mysql,Symfony,Doctrine Orm,Doctrine,我正在尝试执行一个查询,其中我有一个实体Job和一个实体JobProperty,其中1Job可以有许多JobProperties 解释如何基于一个实体的子实体的值检索该实体上的匹配项。基于此,我构建了查询: $qb = $this->getDoctrine()->getRepository('AppBundle:Job')->createQueryBuilder('job') ->innerJoin('job.properties','property'); forea

我正在尝试执行一个查询,其中我有一个实体
Job
和一个实体
JobProperty
,其中1
Job
可以有许多
JobProperties

解释如何基于一个实体的子实体的值检索该实体上的匹配项。基于此,我构建了查询:

$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();
这里有另一个答案作为参考,与你的问题类似