Связь один к одному в Laravel

Связь один к одному - это когда одна запись одной таблицы соответствует одной записи другой таблицы.

Давайте посмотрим на примере. Пусть у нас есть следующая таблица с постами:

posts

  • id

Каждый пост имеет одну картинку-миниатюру. При этом картинки хранятся в отдельной таблице:

thumbnails

  • id
  • path
  • alt

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

Давайте сделаем это. Создадим модель для миниатюр:

<?php class Thumbnail extends Model { } ?>

Создадим модель для постов:

<?php class Post extends Model { } ?>

Заюзаем в модели для постов модель для миниатюр:

<?php use App\Models\Thumbnail; class Post extends Model { } ?>

В модели для постов создадим метод thumbnail:

<?php class Post extends Model { public function thumbnail() { } } ?>

В этом методе свяжем наши модели через метод hasOne:

<?php class Post extends Model { public function thumbnail() { return $this->hasOne(Thumbnail::class); } } ?>

Сделайте следующие таблицы:

users

  • id
  • login

profiles

  • id
  • name
  • surname
  • email

Свяжите эти таблицы отношением hasOne.

Соглашения

Все связи в Laravel работают через соглашение: имена таблиц всегда даются во множественном числе, а поля связи - в единственном.