Laravel: Отношения моделей один к одному - hasOne, belongsTo

В Laravel, связь One-to-One описывается с помощью метода hasOne и belongsTo.

Допустим, у нас есть две модели: User и Phone, где каждый пользователь имеет только один номер телефона, и каждый номер телефона принадлежит только одному пользователю.

Для связывания этих моделей, мы должны определить метод phone в модели User, который будет возвращать объект Phone, и метод user в модели Phone, который будет возвращать объект User. Кроме того, мы должны указать взаимосвязь между этими моделями в их таблицах базы данных.

hasOne

class User extends Model
{
    public function phone()
    {
        return $this->hasOne(Phone::class);
    }
}

belongsTo

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

В таблице базы данных для модели Phone мы должны добавить столбец user_id, который будет являться внешним ключом, указывающим на связанную модель User.

Также, можно указать настройки связи, такие как имя столбца с внешним ключом, имя столбца с первичным ключом, имя метода в связанной модели и т.д. Например:

return $this->hasOne(Phone::class, 'foreign_key', 'local_key');

Подробный разбор метода hasOne

Код return $this->hasOne(Phone::class, 'foreign_key', 'local_key'); описывает связь One-to-One между текущей моделью и моделью Phone. Этот код может быть использован в методе модели текущей модели, который описывает связь.

Аргументы метода hasOne:

  • Phone::class - это строка, указывающая на имя связанной модели.
  • 'foreign_key' - это строка, указывающая на имя столбца в таблице текущей модели, который содержит внешний ключ, связывающий текущую модель с моделью Phone.
  • 'local_key' - это строка, указывающая на имя столбца в таблице модели Phone, который содержит первичный ключ, связывающий модель Phone с текущей моделью. Этот аргумент не обязательный и, если не указан, Laravel будет искать столбец с именем в формате название_текущей_модели_id в таблице модели Phone.

Таким образом, код return $this->hasOne(Phone::class, 'foreign_key', 'local_key'); указывает, что текущая модель имеет связь One-to-One с моделью Phone, используя столбец 'foreign_key' в таблице текущей модели в качестве внешнего ключа и столбец 'local_key' в таблице модели Phone в качестве первичного ключа. Обратите внимание, что вы должны заменить 'foreign_key' и 'local_key' на реальные имена столбцов в своих таблицах базы данных.

Хитрости best practice

  • Не забывайте добавлять индексы к столбцам внешнего ключа в таблице базы данных для оптимизации запросов.
  • При использовании связи One-to-One, желательно, чтобы у каждой модели был уникальный первичный ключ, например, идентификатор модели.
  • Для эффективного использования связи One-to-One, желательно использовать жадную загрузку, чтобы избежать большого количества запросов к базе данных. Например:
$user = User::with('phone')->find(1);

Этот код загрузит модель User с id равным 1 и связанную с ней модель Phone в одном запросе к базе данных.

Статьи по теме Laravel Relations

Комментарии (0)

  1. Напишите первый комментарий
*Комментарий будет опубликован после проверки модератором

Похожие статьи

Загрузка изображения в Laravel

Русификация Laravel

Добавить поле к существующей таблице Laravel

Как поменять язык в Faker

Транслитерация URL в Laravel. Примеры str_slug()

Разработка бота Telegram с помощью Botman на локальном компьютере

Валидация данных в Laravel form request

Laravel Excel - Базовый экспорт

Добавить в botman editMessageText для Telegram

Как сделать middleware в Laravel 6 - простой пример

Laravel: Отношения моделей многие ко многим - belongsToMany

Laravel: Отношения моделей один ко многим - hasMany, belongsTo

Как русифицировать или поменять шаблон уведомления о сбросе пароля в Laravel

Создать ссылку на storage из внешнего каталога для Laravel

Установить Laravel в отдельную папку (site.ru/laravel/)

Валидация номера кредитной карты на PHP (Laravel)

Создание form request в Laravel: руководство для начинающих

Связать папку storage с папкой public в Laravel

Экспорт маршрутов из Laravel в JSON файл

Откуда в Laravel Jetstream (inertia) prop auth.user?

Обработка ошибок в Laravel form request

Постраничная навигация на Bootstrap в Laravel 8

Blade - расширить @section с использованием директивы @parent

Добавить данные об авторизации при каждом запросе к API в Laravel

Работа с файлами в Laravel Form Request

Работа с вложенными объектами и коллекциями в Laravel form request

Laravel: Отношение через таблицу-посредника - hasOneThrough()

Стандартные свойства модели в Laravel

Laravel: Отношения моделей один к одному - hasOne, belongsTo

Laravel: Отношение через таблицу-посредника - hasManyThrough()

Авторизацией и аутентификация в Laravel form request

Установка Laravel и создание нового проекта

Создание уникального индекса в миграции Laravel

Laravel form request для создания API-запросов

Настройка команды CRON на хостинге nic.ru для активации Laravel schedule

HTTP-запросы в Laravel form request - работа с различными типами запросов

Создание класса модели в Laravel

Создание таблицы в базе данных (миграции) для модели в Laravel

Как создать модель в Laravel

Базовые методы CRUD контроллера для модели в Laravel

Наш сайт использует куки, нажмите «ОК» если вы не против
OK