Laravel Eloquent
Priority: P0 (CRITICAL)
Structure
app/
└── Models/
├── {Model}.php
└── Scopes/ # Advanced global scopes
Implementation Guidelines
Query Efficiency & Performance
- N+1 Prevention: Always use
with()or$withfor relationships. Never access relationship properties in a loop without eager loading (N+1 Prevention). - Strict Loading: Call
Eloquent::preventLazyLoading(!app()->isProduction())inAppServiceProvider::boot()to throwLazyLoadingViolationExceptionin local/dev. - Large Datasets: Use
chunk(),lazy(), orcursor()for processing many records without memory issues (Memory Efficiency).
Query Logic & Scopes
- Reusable Scopes: Define
scopeName(Builder $query): Buildermethods in models for reusable query filters. - Chaining: Chain scopes (e.g.,
User::active()->verified()->get()) to keep controllers from duplicating query logic.
Models & Security
- Mass Assignment: Always define
protected $fillablearray; use$request->validated()forModel::create(). - Casting: Use
protected $castsfor dates, JSON, and custom types to ensure data consistency.
Anti-Patterns
- No lazy loading: Eager-load with
with()or$with; never in loops. - No business logic in Models: Move to Services or Actions.
- No raw SQL strings: Use Query Builder or Eloquent methods.
- No
select *: Specify required columns to limit data transfer.
References
- Eloquent Performance Guide