# Laravel:eloquent Relationships

> Define clear relationships and load data efficiently; prevent N+1, use constraints, counts/sums, and pivot syncing safely

- Skill: `jpcaparas/laravel-eloquent-relationships` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jpcaparas/laravel-eloquent-relationships`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jpcaparas/laravel-eloquent-relationships/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: jpcaparas (https://skillmd.com/u/jpcaparas)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/jpcaparas/laravel-eloquent-relationships

---


# Eloquent Relationships and Loading

Model relationships express your domain; load only what you need.

## Commands

```
# Typical loading
Post::with(['author', 'tags'])->withCount('comments')->paginate(20);

# Constrained eager loading
User::with(['posts' => fn($q) => $q->latest()->where('published', true)])->find($id);

# Pivot ops (many-to-many)
$post->tags()->sync([1,2,3]);       // atomic replace
$post->tags()->syncWithoutDetaching([4]);

# Chunking large reads
Order::where('status', 'open')->lazy()->each(fn($o) => ...);
```

## Patterns

- See `laravel:performance-eager-loading` for N+1 detection and measurement
- Use `whereHas()` / `has()` to filter by related existence
- Prefer `withCount`, `withSum`, `withMax` for simple aggregates
- Apply global / local scopes for recurring constraints
- Keep relationship names consistent and pluralized where appropriate
- Laravel 13+: serialized Eloquent collections (e.g., in queued jobs) now restore eager-loaded relations after deserialization, matching single-model behavior — don't rely on relations being absent
- Laravel 13+: model-level attributes like `#[DateFormat('Y-m-d')]` and `#[WithoutTimestamps]` are available (see `laravel:php-attributes`)

