关于 doctrine-fetch-modes
面向 Symfony 和 Doctrine 的开发技能,帮助选择抓取策略并设计读取查询。通过 fetch join、DTO 投影和 DBAL 4 方法,减少 N+1 查询与过度抓取。
主要功能
- 01诊断 N+1 查询
- 02选择关联抓取模式
- 03用 fetch join 加载所需数据
- 04将读取结果投影为 DTO
- 05使用 DBAL 4 查询方法
适用场景
- 01修复存在 N+1 查询的列表接口
- 02为只读列表仅加载所需字段
- 03选择大型集合的抓取方式
- 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。
默认工作流
- 更改任何映射前,先在 Symfony 分析器中确认 N+1 问题或数据过量获取。
- 关联保持
fetch: 'LAZY';对于大型集合,设置fetch: 'EXTRA_LAZY',以便count()、contains()和slice()执行有针对性的 SQL。 - 在仓库中使用 fetch join 加载用例所需的关联(
addSelect()加leftJoin())。 - 对于只读列表,使用
SELECT NEW投影为readonlyDTO(构造函数参数顺序必须与NEW列表一致)。 - 如果结果仅用于展示或按 ID 查找,请使用
Query::HINT_READ_ONLY或按索引别名(createQueryBuilder('p', 'p.id'))。 - 对于原始 SQL,使用 DBAL 4 方法(
fetchAllAssociative()、fetchOne()、executeStatement())。
注意事项
- ORM 3.0 到 3.2 中的 DQL
PARTIAL会报错,直到 3.3 才会返回结果:只读列表应改用SELECT NEWDTO。 - 避免在映射上设置
fetch: 'EAGER';在查询中使用 fetch join,即可为各个用例获得相同结果。 SELECT NEW返回的是 DTO,而不是托管实体:切勿修改或刷新它们。- DBAL 4 已移除
query()、exec()和fetchAll()。
渐进式披露
- 使用此文件了解执行方式和风险控制。
- 需要深入了解实现细节时,打开参考资料。
输出约定
- 仓库方法及其按用例选择的获取策略。
- DTO 类以及为其填充数据的
SELECT NEW查询。 - 分析器或
doctrine:query:dql --show-sql显示的变更前后查询数量。
参考资料
reference.md
评论
支持 Markdown