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

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

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

posts

  • id
  • title

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

thumbnails

  • id
  • path
  • alt
  • post_id

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

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

app/Models/Thumbnail.php<?php
  class Thumbnail extends Model
  {
    
  }
?>

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

app/Models/Post.php<?php
  class Post extends Model
  {
    
  }
?>

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

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

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

app/Models/Post.php<?php
  class Post extends Model
  {
    public function thumbnail()
    {
      
    }
  }
?>

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

app/Models/Post.php<?php
  class Post extends Model
  {
    public function thumbnail()
    {
      return $this->hasOne(Thumbnail::class);
    }
  }
?>
Задание 1

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

users

  • id
  • login
  • password

profiles

  • id
  • name
  • surname
  • email
  • user_id
Задание 2

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

Соглашения

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