doctrine-fetch-modes
Installation
SKILL.md
Doctrine Fetch Modes (Symfony)
Use when
- A list or detail endpoint runs one query per row (N+1) on a relation.
- A read-only list needs a few columns, not full managed entities.
- Choosing
LAZY,EAGERorEXTRA_LAZYon a mapping, or porting ORM 2 code that relied onPARTIALobjects. - A report or projection query drops to raw SQL through DBAL 4.
Default workflow
- Confirm the N+1 or over-fetch in the Symfony profiler before changing any mapping.
- Keep relations on
fetch: 'LAZY'; setfetch: 'EXTRA_LAZY'on large collections socount(),contains()andslice()run targeted SQL. - Load the relations a use case needs with a fetch join in the repository (
addSelect()plusleftJoin()). - For read-only lists, project into a
readonlyDTO withSELECT NEW(constructor argument order must match theNEWlist). - Use
Query::HINT_READ_ONLYor an index-by alias (createQueryBuilder('p', 'p.id')) when the result is only displayed or looked up by id. - For raw SQL, use the DBAL 4 methods (
fetchAllAssociative(),fetchOne(),executeStatement()).