2016-01-25 42 views
1

我有一个名为$configurations的集合数组。这个数组匹配我的实体Configuration.php连接到Product.php作为ManyToMany。现在我有另一个名为WorkType.php的实体,它通过ManyToMany连接到Configuration.phpdoctrine2 queryBuilder必须仅返回与数组值(ids)匹配的结果:0 /空和/或一个和/或许多id必须返回一个结果

目标是恢复具有当前工作类型的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(); 
    } 

它的工作原理,但proble是返回我配置的阵列我传递给查询所有的产品配套。

例如,如果阵列有idConfiguration.php ,查询返回我configuration.id = 1configuration.id = 2configuration.id产品匹配= 1和2

所以我有3个条件来实现,我只需要一个; e-g只有包含所有configuration.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 

由于配置的选择可以改变,我需要创建这个充满活力的方法。我怎样才能得到好的结果?

回答

2

我最近和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 s无关的Product的情况。

+0

感谢您的回答,我现在还没有与我的代码,但请指望我尝试一下您的建议。谢谢你的方式! –

+0

如果我输入** 2或多个配置**,则您的解决方案可以很好地工作,但如果我的数组包含** 0/NULL或1 Configuration **,则查询将为我的所有产品返回workType。所以我需要解决这个问题。 –

+1

@french_dev如果我很好地理解了您的评论,那么当您传递一个空数组时,我编辑了我的代码以限制为Product,而不进行配置。关于仅传递一种配置的情况,您应该只将产品连接到该配置。 –

相关问题