繁体   English   中英

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

[英]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的集合数组。 此数组匹配我的Entity Configuration.php连接到Product.php作为ManyToMany 现在我有另一个名为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();
  }

它的工作原理,但问题是它返回了我传递给查询的所有配置数据产品。

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

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

我只需要返回唯一一个包含Configuration.phpids的产品,该产品传递给当前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

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

我最近和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循环来创建不同的令牌(由开头的字符串: ),否则主义不把它们添加到的参数,它的内部集合。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM