【问题标题】:Doctrine QueryBuilder: ManyToOne Relationship where more than one subEntity must matchDoctrine QueryBuilder:ManyToOne 关系,其中多个子实体必须匹配
【发布时间】:2018-04-06 10:18:42
【问题描述】:

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

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

上面的查询在一定程度上有效,但它提供了属性与任何过滤器匹配的结果,并且不仅提供匹配所有过滤器的结果。我需要它只返回匹配所有过滤器的结果。

我可能不得不以不同的方式解决这个问题,但我不确定我是否会实施。

【问题讨论】:

    标签: php mysql symfony doctrine-orm doctrine


    【解决方案1】:

    您没有正确执行此操作,您将标签和值与最后一个过滤器值匹配,因为查询中使用的占位符 :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

    【讨论】:

      猜你喜欢
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2016-12-05
      相关资源
      最近更新 更多