mcpField
D
doctrine-fetch-modes

doctrine-fetch-modes

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

关于 doctrine-fetch-modes

面向 Symfony 和 Doctrine 的开发技能,帮助选择抓取策略并设计读取查询。通过 fetch join、DTO 投影和 DBAL 4 方法,减少 N+1 查询与过度抓取。

主要功能

  1. 01诊断 N+1 查询
  2. 02选择关联抓取模式
  3. 03用 fetch join 加载所需数据
  4. 04将读取结果投影为 DTO
  5. 05使用 DBAL 4 查询方法

适用场景

  1. 01修复存在 N+1 查询的列表接口
  2. 02为只读列表仅加载所需字段
  3. 03选择大型集合的抓取方式
  4. 04用 DBAL 4 编写报表查询

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/dev-toolings/superpowers-symfony --skill doctrine-fetch-modes

安装后在 Claude Code 中输入/doctrine-fetch-modes确认已加载。

附带文件reference.md

详细介绍

Doctrine 获取模式(Symfony)

适用场景

  • 列表或详情端点对某个关联每行执行一次查询(N+1 问题)。
  • 只读列表只需要少量列,而不是完整的托管实体。
  • 为映射选择 LAZY、EAGER 或 EXTRA_LAZY,或迁移依赖 PARTIAL 对象的 ORM 2 代码。
  • 报表或投影查询通过 DBAL 4 改用原始 SQL。

默认工作流

  1. 更改任何映射前,先在 Symfony 分析器中确认 N+1 问题或数据过量获取。
  2. 关联保持 fetch: 'LAZY';对于大型集合,设置 fetch: 'EXTRA_LAZY',以便 count()、contains() 和 slice() 执行有针对性的 SQL。
  3. 在仓库中使用 fetch join 加载用例所需的关联(addSelect() 加 leftJoin())。
  4. 对于只读列表,使用 SELECT NEW 投影为 readonly DTO(构造函数参数顺序必须与 NEW 列表一致)。
  5. 如果结果仅用于展示或按 ID 查找,请使用 Query::HINT_READ_ONLY 或按索引别名(createQueryBuilder('p', 'p.id'))。
  6. 对于原始 SQL,使用 DBAL 4 方法(fetchAllAssociative()、fetchOne()、executeStatement())。

注意事项

  • ORM 3.0 到 3.2 中的 DQL PARTIAL 会报错,直到 3.3 才会返回结果:只读列表应改用 SELECT NEW DTO。
  • 避免在映射上设置 fetch: 'EAGER';在查询中使用 fetch join,即可为各个用例获得相同结果。
  • SELECT NEW 返回的是 DTO,而不是托管实体:切勿修改或刷新它们。
  • DBAL 4 已移除 query()、exec() 和 fetchAll()。

渐进式披露

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

输出约定

  • 仓库方法及其按用例选择的获取策略。
  • DTO 类以及为其填充数据的 SELECT NEW 查询。
  • 分析器或 doctrine:query:dql --show-sql 显示的变更前后查询数量。

参考资料

  • reference.md

评论

支持 Markdown