Связь Laravel «один-ко-многим» с пользовательскими первичными ключами: объяснение на примерах

В Laravel Eloquent ORM предоставляет удобный способ определения связей между таблицами базы данных и управления ими. Одной из наиболее распространенных связей является связь «один ко многим», когда одна запись в одной таблице связана с несколькими записями в другой таблице. В этой статье мы рассмотрим, как установить связь «один-ко-многим» с помощью пользовательских первичных ключей в Laravel.

  1. Определение моделей.
    Чтобы настроить связь «один ко многим», нам необходимо определить две модели: сторону «одна» и сторону «многие». Предположим, у нас есть две таблицы: «Пользователи» и «Сообщения», где каждый пользователь может иметь несколько сообщений. Начнем с создания моделей «Пользователь» и «Сообщение».
// User model
class User extends Model
{
    protected $primaryKey = 'user_id';

    public function posts()
    {
        return $this->hasMany(Post::class, 'user_id', 'user_id');
    }
}
// Post model
class Post extends Model
{
    protected $primaryKey = 'post_id';

    public function user()
    {
        return $this->belongsTo(User::class, 'user_id', 'user_id');
    }
}
  1. Установление связи.
    В модели «Пользователь» мы определяем метод hasMany()для указания связи с моделью «Почта». Мы передаем класс целевой модели (Post::class) и внешний ключ (user_id) в качестве аргументов. Кроме того, мы указываем локальный ключ (user_id), соответствующий пользовательскому первичному ключу модели User. В модели Post мы определяем метод belongsTo()для установления обратной зависимости.

  2. Доступ к связанным данным.
    Как только связь установлена, мы можем получить доступ к связанным данным, используя определенные методы. Например, чтобы получить все сообщения, принадлежащие пользователю, мы можем использовать метод posts():

$user = User::find(1);
$posts = $user->posts;
  1. Создание связанных записей.
    Чтобы создать новое сообщение, связанное с пользователем, мы можем использовать метод create()или вручную установить внешний ключ перед сохранением сообщения:
$user = User::find(1);
// Using create() method
$post = $user->posts()->create([
    'title' => 'New Post',
    'content' => 'Lorem ipsum dolor sit amet.',
]);
// Manually setting the foreign key
$post = new Post([
    'title' => 'New Post',
    'content' => 'Lorem ipsum dolor sit amet.',
]);
$post->user_id = $user->user_id;
$post->save();

В этой статье мы рассмотрели, как установить связь «один-ко-многим» с использованием пользовательских первичных ключей в Laravel. Определяя отношения в моделях и используя соответствующие методы, мы можем легко получать доступ к связанным данным и манипулировать ими. Используя возможности Eloquent ORM Laravel, вы можете легко и эффективно управлять сложными взаимоотношениями с базами данных.