Symfony 查询生成器(多对多关系)

Posted

技术标签:

【中文标题】Symfony 查询生成器(多对多关系)【英文标题】:Symfony Query Builder (Many to many relation) 【发布时间】: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 属性? 【参考方案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。

以上是关于Symfony 查询生成器(多对多关系)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Doctrine 和 Symfony2 查询多对多关系

Symfony2 删除并保存多对多关系

Symfony 固定装置和多对多关系(学说)

关于symfony的多对多关联关系的字段更新

具有多对多关系的 Symfony 5 对象序列化超时

JPA多对多关系:无法插入生成的表