Связь один к одному через в Laravel
Иногда нужная модель связана не напрямую,
а через третью таблицу. Для связи
один к одному через используют
метод hasOneThrough.
Пусть есть механики, машины и владельцы. У механика одна машина, у машины один владелец. Механик и владелец напрямую не связаны, но владелец доступен через машину:
mechanics
- id
- name
cars
- id
- model
- mechanic_id
owners
- id
- name
- car_id
В модели механика пропишем отношение. Первый параметр - конечная модель, второй - промежуточная:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Mechanic extends Model
{
public function carOwner()
{
return $this->hasOneThrough(
Owner::class,
Car::class
);
}
}
?>
Теперь владельца можно получить так:
<?php
$mechanic = Mechanic::find(1);
$owner = $mechanic->carOwner;
echo $owner->name;
?>
Сделайте таблицы authors,
books и publishers.
У автора одна книга, у книги один
издатель. Свяжите автора с издателем
через hasOneThrough.
Получите издателя для выбранного автора через отношение.