Отношение Один-ко-Многим — это почти как реальная жизнь: один человек может завести жен, любовниц, детей. В нашем случае кучу постов, комментариев, подписчиков. Laravel тут дает немного облегчения, через Eloquent, но если не понимаешь, что к чему, потом плачешь, держа SQL-запросы в зубах. Давай разберем, как делать это без костылей.

Определение отношения

Шаг 1: Две модели

Берем две модели, которые реально нужны. Например, User и Post. Один юзер — много постов.

Шаг 2: В User

Метод hasMany() говорит Laravel: «Эй, этот юзер может иметь кучу постов, не потеряй их».

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // Один юзер — много постов
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

Шаг 3: В Post

Метод belongsTo() — обратка. Каждый пост знает своего хозяина.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // Пост принадлежит юзеру
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Всё. Два метода, и связь работает. Никакой магии, просто держи ключи правильно.

Использование отношения

Получение связанных моделей

Хочешь все посты конкретного юзера — дергай свойство:

$user = User::find(1);
$posts = $user->posts; // Все посты юзера 

Не нужно писать SQL руками, Eloquent сам все подтягивает.

Создание новых связанных моделей

Создать пост и привязать к юзеру просто:

$user = User::find(1);
$post = new Post(['title' => 'Новый пост', 'body' => 'Тут содержимое.']);
$user->posts()->save($post); // Сохраняем и связываем 

Если сделаешь это руками через $post->user_id = $user->id; $post->save();, тоже сработает, но зачем мучить себя, если есть save() через отношение?

Практические моменты

  • Ленивая загрузка vs eager loading$user->posts дергает базу отдельно. Если выбираешь десятки юзеров с постами, используй with('posts'), иначе база будет гореть.
  • Создание через отношениеsave() и create() через hasMany() гарантируют правильные ключи. Не забивай руками, иначе потом отлавливай баги.
  • firstOrCreate() — удобно, если не знаешь, есть ли пост. Не нужно проверять существование вручную.

Почему это реально удобно

Laravel делает кучу работы за тебя: связывает ключи, строит запросы, проверяет наличие данных. Тебе остается только использовать методы. Если делать все вручную через SQL и user_id — быстрее нажмешь себе на мозг, чем базу загрузишь.

Вывод

Один-ко-Многим — это про четкость и порядок: один объект ведет за собой много других. Держи код понятным, используй Eloquent, не изобретай велосипед. Это реально работает и спасает нервы, если не забивать руками на связи.