关于 doctrine-relations
面向 Symfony 和 Doctrine 的开发技能,用于映射实体关联并管理持久化行为。内容涵盖拥有方选择、级联、孤儿删除、集合加载及多个实体管理器。
主要功能
- 01映射拥有方与反向方
- 02同步维护双向集合
- 03选择级联与孤儿删除
- 04处理大型集合与 fetch join
- 05使用多个实体管理器
适用场景
- 01映射新的 Doctrine 关联
- 02修复未能持久化的关联
- 03选择子实体的删除行为
- 04跨实体管理器访问仓库
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dev-toolings/ superpowers-symfony --skill doctrine-relations安装后在 Claude Code 中输入/doctrine-relations确认已加载。
附带文件reference.md
详细介绍
Doctrine 关联(Symfony)
适用场景
- 映射
ManyToOne、OneToMany、ManyToMany或OneToOne,并选择拥有方。 - 为子实体决定使用
cascade还是orphanRemoval。 - 关联未能持久化(只设置了反向方),或在大型反向集合中调用
contains()速度很慢。 - 将实体拆分到多个实体管理器中。
默认工作流
- 选择拥有方(持有外键的
ManyToOne,使用inversedBy)和反向方(使用mappedBy的OneToMany)。 - 在构造函数中使用
ArrayCollection初始化集合,并编写addX()和removeX()辅助方法,使双方保持同步。 - 对需要一起保存的聚合使用
cascade: ['persist'],仅在真正的组合关系中使用orphanRemoval: true。 - 将大型反向集合标记为
fetch: 'EXTRA_LAZY',或从拥有方检查成员关系。 - 在读取关联的用例中添加 fetch join,以避免 N+1 查询。
- 使用多个实体管理器时,将每组实体保留在同一个管理器中,并通过
ManagerRegistry获取存储库。
注意事项
- Doctrine 会持久化拥有方所持有的内容:始终设置
ManyToOne引用。 - 避免在大型集合上使用
cascade: ['remove'](每行都会执行一次 DELETE),也绝不要对共享实体使用orphanRemoval。 - 一个关联不能跨越两个实体管理器。
- 对于非默认实体管理器,使用
ManagerRegistry::getRepository(Entity::class, 'name')获取存储库。
渐进式展开
- 使用此文件了解执行方式和风险控制。
- 需要深入了解实现细节时,打开参考资料。
输出约定
- 包含拥有方和反向方的实体映射,以及 cascade 和 orphan 的决策。
- 大型集合和热点路径的获取策略。
doctrine:schema:validate的结果。
参考资料
reference.md
评论
支持 Markdown