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

fre*_*dev 1 php dql query-builder symfony doctrine-orm

我有一个名为 的集合数组$configurations。该数组Configuration.phpProduct.php作为ManyToMany. 现在我有另一个名为的实体WorkType.php,它也Configuration.php通过ManyToMany.

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

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

所以我在我的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();
  }
Run Code Online (Sandbox Code Playgroud)

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

例如,如果数组具有1id 2 ,则查询将返回与configuration.id = 1configuration.id = 2configuration.id =1 和 2Configuration.php匹配的产品。

所以我有3个条件要实现,我只需要一个;例如仅包含所有configuration.id的产品!

我只需要返回唯一一个包含传递到当前数组中的idsof的产品!Configuration.phpWorkType.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
Run Code Online (Sandbox Code Playgroud)

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

Lex*_*tor 5

我最近在 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);
Run Code Online (Sandbox Code Playgroud)

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

Product编辑:修改查询以考虑您不传递任何配置并希望获取与 s 没有关系的s的情况Configuration