sql - QueryBuilder 中的多对多
问题描述
对于我的 Symfony 项目,我正在创建一个表单。
在这种形式中,用户可以选择一个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-建设者)
我已经尝试了很多东西,但我无法将那个简单的(?)查询转换为 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) 。不要做相反的事情->from('App:Group', 'group')->join('group.animals', 'groupAnimal')。对于 SQL,您会得到相同的结果,但 Doctrine 无法按照您的意愿处理它。
使用内部联接仅检索分配给任何组的实体:
$entityRepository->createQueryBuilder()
->select('animal')
->from('App:Animal', 'animal')
->innerJoin('animal.group', group)
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')
在这种情况下,是否需要单向或双向关系取决于您。仅当子端不包含太多条目时,才建议使用双向关系。
推荐阅读
- javascript - 来自状态变量 React 的谷歌地图上的多个标记
- node.js - Why I get wrong link from attribute href from site steam?
- google-apps-script - google-apps-script ScriptProperties broken?
- sql - how to compare two tables having different number of columns in sql
- flutter - 如何在 Flutter 中的流式请求(发送)中发送授权标头数据
- python - 与 LSTM 一起前进?
- html - Bootstrap 按钮,文本分布在两行中,每行字体大小不同
- amazon-redshift - 按月使用 RedShift 进行队列分析
- php - 调用未定义的函数 imagewebp (Dockerfile, php, gd, webp)
- scala - 如何将我的测试台与 C++ 库集成在凿子中?