Laravel Eloquent
Priority: P0 (CRITICAL)
Workflow: Add a Model with Safe Queries
- Define model — Set
$fillable,$casts, and relationships. - Enable strict loading — Call
preventLazyLoading(!app()->isProduction())in AppServiceProvider. - Add scopes — Create
scopeActive(),scopeVerified()for reusable filters. - Eager-load in queries — Use
with()for all relationship access. - Process large datasets — Use
chunk()orcursor()instead ofget().
Scope + Eager Loading Example
See implementation examples for model scopes, eager loading, and directory structure.
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.