【问题标题】:Many-to-many in QueryBuilderQueryBuilder 中的多对多
【发布时间】:2021-04-03 09:50:08
【问题描述】:

对于我的 Symfony 项目,我正在创建一个表单。
在这种形式中,用户可以选择Animal 实体,但前提是它是任何Group 实体的一部分。
它们使用many-to-many 关系链接。
Group 实体有一个名为 animals 的属性,它是 CollectionAnimal 实体。

由于我使用的是many-to-many 关系,因此创建了三个表:animalgroupgroup_animal

现在,如果我要使用 SQL 查询,我会执行以下操作:

SELECT * FROM animal INNER JOIN group_animal ON group_animal.animal_id = animal.id

这样我就可以得到任何组中的所有动物。

问题是我正在使用 Symfony 的 FormTypes,我可以执行自定义查询的唯一方法是使用 query_builder 选项 (https://symfony.com/doc/current/reference/forms/types/entity.html#query-builder)

我尝试了很多方法,但就是无法将那个简单的(?)查询转换为 QueryBuilder。

我最接近的是:

$entityRepository->createQueryBuilder('animal')
    ->from('App:Group', 'group')
    ->join('group.animals', 'groupAnimal')
    ->where('groupAnimal.id = animal.id')

它有效,但现在我的“FROM”中有 2 个表格,感觉不对。

谁能帮我解决这个问题?

【问题讨论】:

  • 您好!你没有关系的反面吗?喜欢 Animal 实体上的 groups 属性?
  • 不,我没有,不过我可以添加它……那有可能吗?

标签: sql doctrine-orm doctrine


【解决方案1】:

1.使用多对多双向关系

始终对包含所需数据的表使用 ->from('App:Animal', 'animal')->join('animal.group', group)。不要做相反的事情->from('App:Group', 'group')->join('group.animals', 'groupAnimal')。对于 SQL,您会得到相同的结果,但 Doctrine 无法按您的意愿处理。

使用内部联接仅检索分配给任何组的实体:

$entityRepository->createQueryBuilder()
    ->select('animal')
    ->from('App:Animal', 'animal')
    ->innerJoin('animal.group', group)

更多关于双向关系:https://www.doctrine-project.org/projects/doctrine-orm/en/2.8/reference/association-mapping.html#many-to-many-bidirectional

2。单向一对多关系(推荐)

在这种情况下,您应该打破多对多关系并创建新的连接表 App:AnimalGroup 将这两个表连接在一起。它并不适用于所有用例,但它更面向未来,更易于阅读并准备好为关系添加元数据:

use Doctrine\ORM\Query\Expr\Join;

$entityRepository->createQueryBuilder()
    ->select('animal')
    ->from('App:Animal', 'animal')
    ->innerJoin('App:AnimalGroup', 'animal_group', Join::WITH, 'animal_group.animal = animal')

在这种情况下,您是否需要单向或双向关系取决于您。仅当子端不包含太多条目时,才建议使用双向关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多