doctrine2 queryBuilder must return only result matching with array values (ids): 0/Null and/or 一个 and/or 许多 id(s) 必须 return 一个结果

doctrine2 queryBuilder must return only result matching with array values (ids): 0/Null and/or One and/or Many id(s) have to return One result

我有一个名为 $configurations 的集合数组。这个数组匹配我的实体 Configuration.php 作为 ManyToMany 连接到 Product.php。现在我有另一个名为 WorkType.php 的实体,它也通过 ManyToMany.

连接到 Configuration.php

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

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

所以我在 ProductRepository.php:

中创建了这个 queryBuilder
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();
  }

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

例如,如果数组有 id 12 of Configuration.php,则查询 return请给我 configuration.id = 1, configuration.id = 2configuration.id=1和2

So I have 3 conditions to achieve, I need only one; e-g only the product which containing all the configuration.id !

我只需要return将Configuration.php的唯一一个包含ids的产品传入当前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

由于配置的选择可能会改变,我需要创建这个动态方法。我怎样才能return取得好成绩?

我最近在 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 不会将它们添加到其内部参数集合中。

编辑:修改查询以考虑您未通过任何配置并希望获得与 Configurations 无关的 Products 的情况。