"Связи в Eloquent: One-to-One, HasMany и Many-to-Many"
Laravel Eloquent ORM предоставляет мощную систему связей между моделями.
С помощью relationships можно строить сложную архитектуру базы данных без написания большого количества SQL.
В этой статье разберём:
- One-to-One;
- One-to-Many;
- Many-to-Many;
- pivot tables;
- eager loading;
- оптимизацию связей.
Что такое Eloquent Relationships
Связи позволяют моделям взаимодействовать друг с другом.
Например:
- пользователь имеет посты;
- пост принадлежит автору;
- пользователь имеет роли.
One-to-One связь
Пример:
- User
- Profile
User model
public function profile()
{
return $this->hasOne(Profile::class);
}
Profile model
public function user()
{
return $this->belongsTo(User::class);
}
One-to-Many связь
Самая популярная связь Laravel.
Пример:
- User
- Posts
HasMany
public function posts()
{
return $this->hasMany(Post::class);
}
BelongsTo
public function user()
{
return $this->belongsTo(User::class);
}
Получение связанных данных
$user->posts;
Many-to-Many связь
Пример:
- Users
- Roles
Нужна pivot table:
role_user
belongsToMany
public function roles()
{
return $this->belongsToMany(Role::class);
}
Attach и Detach
Добавление связи
$user->roles()->attach($roleId);
Удаление связи
$user->roles()->detach($roleId);
Sync
$user->roles()->sync([1, 2, 3]);
Pivot Data
->withPivot('expires_at')
hasOneThrough
Laravel поддерживает сложные relationships.
morphMany и Polymorphic
Polymorphic relations позволяют одной модели принадлежать нескольким типам моделей.
Eager Loading
Очень важно для производительности.
User::with('posts')->get();
Lazy Loading Problem
Без eager loading возникает:
N+1 query problem
Ограничение связанных данных
User::with([
'posts' => function ($query) {
$query->latest();
}
])->get();
Count relationships
User::withCount('posts')->get();
Лучшие практики Eloquent Relationships
Рекомендуется:
- использовать eager loading;
- добавлять foreign keys;
- индексировать relation columns;
- избегать лишнего lazy loading.
Laravel Relationships и API
Связи активно используются в:
- REST API;
- GraphQL;
- админках;
- CRM;
- SaaS-проектах.
Итоги
Laravel relationships делают работу с database удобной и выразительной.
С помощью Eloquent relations можно:
- строить сложные связи;
- оптимизировать запросы;
- писать чистый код;
- быстро создавать масштабируемые приложения.