Связи: один к одному и один ко многим
Один к одному
Ситуация: у пользователя один профиль.
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();
}