fre*_*dev 1 php dql query-builder symfony doctrine-orm
我有一个名为 的集合数组$configurations。该数组Configuration.php与Product.php作为ManyToMany. 现在我有另一个名为的实体WorkType.php,它也Configuration.php通过ManyToMany.
目标是恢复具有当前工作类型O/Null或配置的产品。Many
默认情况下,我有一个没有配置的产品,但用户可以通过复选框选择一个O/Null或One多个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 = 1、configuration.id = 2和configuration.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)
由于配置的选择可能会发生变化,我需要创建这个动态方法。怎样才能返回好的结果呢?
我最近在 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。
| 归档时间: |
|
| 查看次数: |
2484 次 |
| 最近记录: |