doctrine2 queryBuilder必须只返回与数组值匹配的结果(ids):0 / Null和/或One和/或许多id必须返回一个结果

时间:2016-01-25 16:01:45

标签: php symfony doctrine-orm query-builder dql

我有一个名为$configurations的集合数组。此数组与我的Configuration.php实体Product.php匹配为ManyToMany。现在我有另一个名为WorkType.php的实体,它与Configuration.php的{​​{1}}连接起来。

目标是恢复对当前工作类型具有ManyToManyO/Null配置的产品。

默认情况下,我的产品没有配置,但用户可以通过复选框选择可用于工作类型的ManyO/NullOne配置。

所以我在Many中创建了这个queryBuilder:

ProductRepository.php

它有效,但问题是它返回了所有与我传递给查询的配置数组匹配的产品。

例如,如果数组具有public function getProductByManyConfig($slug, $configurations) { $queryBuilder = $this->getEntityManager()->createQueryBuilder(); $queryBuilder->select('p') ->from('MyBundle', 'p') ->join('p.workType', 'wt', 'WITH', 'wt.id = p.workType') ->leftJoin('p.configurations','c'); $queryBuilder->add('where', $queryBuilder->expr()->in('c', ':c')) ->andWhere('wt.slug = :slug') ->setParameters(array('slug'=> $slug, 'c'=> $configurations)); return $queryBuilder->getQuery() ->getResult(); } 1 2 id,则查询会返回与匹配的产品configuration.id = 1 configuration.id = 2 configuration.id = 1和2

  

所以我有3个条件要实现,我只需要一个; e-g只有哪个产品   包含所有configuration.id!

我只需要返回包含传递到当前Configuration.php数组的ids Configuration.php WorkType.php的唯一产品!

这是我的控制器代码:

$vars = array(); //containing all values I need for recover configurations properties

$em = $this->getDoctrine()->getManager();

$var = array_values($vars);

$configurations = $this->getDoctrine()->getRepository('MyBundle:Configuration')->findByName($var);

foreach ($configurations as $conf) {
  $name = $conf->getName();
}

$slug = "the_right_database_correspondence";

$arrayProbuctConfig = $this->getDoctrine()->getRepository('MyBundle:Product')->getProductByManyConfig($slug, $configurations);

// return of the view

由于配置的选择可能会发生变化,我需要创建这种动态方法。我怎样才能得到好结果?

1 个答案:

答案 0 :(得分:3)

最近我和Doctrine2有同样的问题,我得到了答案。

如果您想要与所有链接的所有Product实体配置,则需要为每个配置添加where条件。

考虑您的$configurations变量是Configuration个实体的数组

$queryBuilder->select('p')
             ->from('MyBundle', 'p')
             ->join('p.workType', 'wt', 'WITH', 'wt.id = p.workType')
             ->leftJoin('p.configurations','c');

$queryBuilder->where('wt.slug = :slug')->setParameter('slug', $slug);

$nbConfs = count($configurations);
  for($i = 0; $i < count($configurations); $i++){
      $queryBuilder->andWhere(":conf{$i} MEMBER OF p.configurations")->setParameter("conf{$i}", $configurations[$i]);
  }

$queryBuilder
      ->having('COUNT(c.id) =:some_count')
      ->setParameter('some_count', $nbConfs);

我必须使用for循环来创建不同的标记(前面带有:的字符串),否则Doctrine不会将它们添加到其内部参数集合中。

编辑:修改查询以考虑不传递任何配置并希望得到与Product无关的Configuration的情况。