QueryBuilder 中的多对多
Many-to-many in QueryBuilder
我正在为我的 Symfony 项目创建一个表单。
在这种形式下,用户可以 select 一个 Animal
实体,但前提是它是任何 Group
实体的一部分。
它们使用 many-to-many
关系链接。
Group
实体有一个名为 animals
的 属性,它是 Collection
个 Animal
实体。
由于我使用的是 many-to-many
关系,因此创建了三个表:animal
、group
和 group_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)
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')
在这种情况下,您是想要单向关系还是双向关系,由您决定。仅当子端不包含太多条目时才推荐双向关系。
我正在为我的 Symfony 项目创建一个表单。
在这种形式下,用户可以 select 一个 Animal
实体,但前提是它是任何 Group
实体的一部分。
它们使用 many-to-many
关系链接。
Group
实体有一个名为 animals
的 属性,它是 Collection
个 Animal
实体。
由于我使用的是 many-to-many
关系,因此创建了三个表:animal
、group
和 group_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)
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')
在这种情况下,您是想要单向关系还是双向关系,由您决定。仅当子端不包含太多条目时才推荐双向关系。