Урок 06

Связи: один к одному и один ко многим

Один к одному

Ситуация: у пользователя один профиль.

User:

public function profile()
{
    return $this->hasOne(Profile::class);
}

Profile:

public function user()
{
    return $this->belongsTo(User::class);
}

Миграция для profiles:

$table->foreignId('user_id')->constrained()->cascadeOnDelete();

Использование:

$profile = User::find(1)->profile;
$user = Profile::find(1)->user;

Один ко многим

Ситуация: у пользователя много постов.

User:

public function posts()
{
    return $this->hasMany(Post::class);
}

Post:

public function user()
{
    return $this->belongsTo(User::class);
}

Миграция для posts:

$table->foreignId('user_id')->constrained()->cascadeOnDelete();

Использование:

$user = User::find(1);
foreach ($user->posts as $post) {
    echo $post->title;
}

$post = Post::find(1);
echo $post->user->name;

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

$user = User::find(1);

$user->posts()->create([
    'title' => 'Новый пост',
    'body' => 'Текст',
]);

Сохранение массива

$user->posts()->saveMany([
    new Post(['title' => 'A']),
    new Post(['title' => 'B']),
]);

Связь с условием

public function publishedPosts()
{
    return $this->hasMany(Post::class)->where('published', true);
}

Связь с сортировкой

public function latestPosts()
{
    return $this->hasMany(Post::class)->latest();
}