doctrine2 queryBuilder must return only result matching with array values (ids): 0/Null and/or 一个 and/or 许多 id(s) 必须 return 一个结果
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
的集合数组。这个数组匹配我的实体 Configuration.php
作为 ManyToMany
连接到 Product.php
。现在我有另一个名为 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();
}
它有效,但问题是它 return 是我所有与我传递给查询的配置数组匹配的产品。
例如,如果数组有 id
1 和 2 of Configuration.php
,则查询 return请给我 configuration.id = 1, configuration.id = 2 和 configuration.id=1和2。
So I have 3 conditions to achieve, I need only one; e-g only the product which
containing all the configuration.id !
我只需要return将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
由于配置的选择可能会改变,我需要创建这个动态方法。我怎样才能return取得好成绩?
我最近在 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
循环来创建不同的标记(:
前面的字符串),否则 Doctrine 不会将它们添加到其内部参数集合中。
编辑:修改查询以考虑您未通过任何配置并希望获得与 Configuration
s 无关的 Product
s 的情况。
我有一个名为 $configurations
的集合数组。这个数组匹配我的实体 Configuration.php
作为 ManyToMany
连接到 Product.php
。现在我有另一个名为 WorkType.php
的实体,它也通过 ManyToMany
.
Configuration.php
目标是恢复当前工作类型具有 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();
}
它有效,但问题是它 return 是我所有与我传递给查询的配置数组匹配的产品。
例如,如果数组有 id
1 和 2 of Configuration.php
,则查询 return请给我 configuration.id = 1, configuration.id = 2 和 configuration.id=1和2。
So I have 3 conditions to achieve, I need only one; e-g only the product which containing all the configuration.id !
我只需要return将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
由于配置的选择可能会改变,我需要创建这个动态方法。我怎样才能return取得好成绩?
我最近在 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
循环来创建不同的标记(:
前面的字符串),否则 Doctrine 不会将它们添加到其内部参数集合中。
编辑:修改查询以考虑您未通过任何配置并希望获得与 Configuration
s 无关的 Product
s 的情况。