QueryBuilder 中的多对多

Many-to-many in QueryBuilder

我正在为我的 Symfony 项目创建一个表单。
在这种形式下,用户可以 select 一个 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 个表,感觉不对。

谁能帮我解决这个问题?

1.使用多对多双向关系

始终使用 ->from('App:Animal', 'animal')->join('animal.group', group) for table 其中包含您想要的数据。不要做相反的->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。单向一对多关系(推荐)

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

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')

在这种情况下,您是想要单向关系还是双向关系,由您决定。仅当子端不包含太多条目时才推荐双向关系。