"Связи в Eloquent: One-to-One, HasMany и Many-to-Many"

Андрей Игнатов
Игнатов Андрей
Founder & Techlead
10 мая 2026
27

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 можно:

  • строить сложные связи;
  • оптимизировать запросы;
  • писать чистый код;
  • быстро создавать масштабируемые приложения.

👉 Заказать бесплатный экспресс-аудит проекта

Задать вопрос

Если у вас возник технический вопрос по нашим статьям или появилась потребность в профессиональной разработке сложного веб-проекта — оставьте свои контакты. Техлид «Команды-А» свяжется с вами, чтобы проконсультировать и помочь найти оптимальное решение.

Нажимая кнопку, вы соглашаетесь с политикой обработки персональных данных.