SuperAPI AI 工具集

doctrine-fetch-modes

编程与开发

查看项目

更新于 10-15 21:08

技能介绍

用途:在 Symfony 项目中优化 Doctrine 的取数方式,主要针对列表或详情接口对关联关系出现每行一次查询(N+1),以及只读列表只需少量列而非完整托管实体的情况。也适用于为映射选择 LAZY、EAGER 或 EXTRA_LAZY,或迁移依赖 PARTIAL 对象的 ORM 2 代码,以及通过 DBAL 4 执行原生 SQL 的报表或投影查询。

主要能力与用法:改动映射前,先在 Symfony profiler 中确认 N+1 或过度取数。关系保持 fetch: 'LAZY';大型集合设为 fetch: 'EXTRA_LAZY',使 count()、contains()、slice() 执行针对性 SQL。在仓储中用 fetch join(addSelect() 加 leftJoin())加载用例所需关系。只读列表用 SELECT NEW 投影到 readonly DTO,构造参数顺序须与 NEW 列表一致。结果仅用于展示或按 id 查找时,可用 Query::HINT_READ_ONLY 或 index-by 别名(createQueryBuilder('p', 'p.id'))。原生 SQL 使用 DBAL 4 的 fetchAllAssociative()、fetchOne()、executeStatement()。

限制与注意:DQL 中的 PARTIAL 在 ORM 3.0 至 3.2 会失败,3.3 起才返回,只读列表应改用 SELECT NEW DTO。避免在映射上使用 fetch: 'EAGER',查询中的 fetch join 可按用例达到相同效果。SELECT NEW 返回 DTO 而非托管实体,不可修改或 flush。DBAL 4 移除了 query()、exec() 和 fetchAll()。输出应包含按用例选择取数策略的仓储方法、DTO 类及其 SELECT NEW 查询,以及改动前后来自 profiler 或 doctrine:query:dql --show-sql 的查询次数。