mcpField
D
doctrine-relations

doctrine-relations

github.com/dev-toolings开发22794 次安装3 周前更新
代码仓库

关于 doctrine-relations

面向 Symfony 和 Doctrine 的开发技能,用于映射实体关联并管理持久化行为。内容涵盖拥有方选择、级联、孤儿删除、集合加载及多个实体管理器。

主要功能

  1. 01映射拥有方与反向方
  2. 02同步维护双向集合
  3. 03选择级联与孤儿删除
  4. 04处理大型集合与 fetch join
  5. 05使用多个实体管理器

适用场景

  1. 01映射新的 Doctrine 关联
  2. 02修复未能持久化的关联
  3. 03选择子实体的删除行为
  4. 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() 速度很慢。
  • 将实体拆分到多个实体管理器中。

默认工作流

  1. 选择拥有方(持有外键的 ManyToOne,使用 inversedBy)和反向方(使用 mappedBy 的 OneToMany)。
  2. 在构造函数中使用 ArrayCollection 初始化集合,并编写 addX() 和 removeX() 辅助方法,使双方保持同步。
  3. 对需要一起保存的聚合使用 cascade: ['persist'],仅在真正的组合关系中使用 orphanRemoval: true。
  4. 将大型反向集合标记为 fetch: 'EXTRA_LAZY',或从拥有方检查成员关系。
  5. 在读取关联的用例中添加 fetch join,以避免 N+1 查询。
  6. 使用多个实体管理器时,将每组实体保留在同一个管理器中,并通过 ManagerRegistry 获取存储库。

注意事项

  • Doctrine 会持久化拥有方所持有的内容:始终设置 ManyToOne 引用。
  • 避免在大型集合上使用 cascade: ['remove'](每行都会执行一次 DELETE),也绝不要对共享实体使用 orphanRemoval。
  • 一个关联不能跨越两个实体管理器。
  • 对于非默认实体管理器,使用 ManagerRegistry::getRepository(Entity::class, 'name') 获取存储库。

渐进式展开

  • 使用此文件了解执行方式和风险控制。
  • 需要深入了解实现细节时,打开参考资料。

输出约定

  • 包含拥有方和反向方的实体映射,以及 cascade 和 orphan 的决策。
  • 大型集合和热点路径的获取策略。
  • doctrine:schema:validate 的结果。

参考资料

  • reference.md

评论

支持 Markdown