[英]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/Null
或Many
配置的产品。
默认情况下,我有一个没有配置的产品,但用户可以通过复选框选择可用于工作类型的O/Null
或One
或Many
配置。
所以我在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.php
的id
1和2 ,则查询返回与configuration.id = 1 , configuration.id = 2和configuration.id = 1和2匹配的产品。
所以我有3个条件要实现,我只需要一个; 例如,只包含所有配置的产品.id!
我只需要返回唯一一个包含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
由于配置的选择可能会改变,我需要创建这种动态方法。 我怎样才能归还好成绩?
我最近和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.