【问题标题】:Symfony Query Builder (Many to many relation)Symfony 查询生成器(多对多关系)
【发布时间】:2021-12-18 13:38:45
【问题描述】:

我对 QueryBuilder 有疑问。 我有两个实体:产品,属性,它们是多对多关系(每个产品可以有很多属性,每个属性可以有很多产品) 我创建产品存储库函数 findByAttributes()

public function findByAttributes($attributes)
{
    $qb = $this->createQueryBuilder('p')
        ->join('p.attributes', 'a')
        ->where('a.slug = :slug1 OR a.slug = :slug2')
        ->setParameter('slug1', 'red')
        ->setParameter('slug2', 'blue')
    ;

    return $qb->getQuery()->getResult();
}

当我使用 OR 时,它工作正常,但是当我切换到 AND 时,结果为空。 使用 AND 我只想选择同时具有这两种属性的产品。

我哪里错了?

Tnx

【问题讨论】:

  • a.slug不能同时等于两个不同的字符串,你确定这里没有问题吗?
  • 嗯...我只想选择具有这两种属性的产品
  • a.slug 是什么?一个字符串?数组 ?你的 where 条件是:a.slug = 'red' 和 a.slug = 'blue',怎么可能同时出现?
  • a.slug 是一个字符串。每个产品不能有很多属性。
  • 那你没看到这里的问题吗?您希望能够检查 a.slug 是否同时等于两个不同的字符串。你说你想只选择具有这两种属性的产品,这怎么可能?是否有多个 slug 属性?

标签: php symfony doctrine query-builder


【解决方案1】:

我明白了!

public function findByAttributes(array $attributes)
{
    $qb = $this->createQueryBuilder('p');

    foreach ($attributes as $i => $attribute) {
        $qb->join('p.attributes', 'a'.$i)
           ->andWhere('a'.$i.'.slug = :slug'.$i.'')
           ->setParameter('slug'.$i, $attribute);
    }

    return $qb->getQuery()->getResult();
}

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2018-11-02
  • 2015-10-26
  • 2011-08-08
相关资源
最近更新 更多