таблицы?
Например, предположим, что в примере из доки есть еще сверху таблица с фирмами(компаниями) 'companies', которая выглядит так:
companies:
id - integer
name - string
а в таблице механиков дополнена связью с фирмами
mechanics:
id - integer
name - string
company_id - integer
Есть ли способ сделать в Owner доступ к Компании типа так:
public function company(): HasOneThrough
{
return $this->hasOneThrough(Company::class, [Car::class, Mechanic::class]);
}
Видел в сети вроде какой-то пакет есть для этого, но не охота его ставить пока что. Может есть какие-то удобные штатные средства, не описанные в доке?
🤔
попробуй типа public function company(): BelongsTo { return $this->car->mechanic->company(); } при условии что все связи описаны
такое не заработает)
только пакетом
у меня работает, просто через 1 а не через 2
ну не знаю, как то оно страшно выглядит
у меня тоже так работает через 2 связи. Не совсем релэйшен, конечно, но мне пойдет 😅 return Company::find($owner->car?->mechanic?->company_id)
да мне надо это один раз в одном месте вывести )) не, это не внутри модели. Это уже по коду, где выводить надо
а $owner->company не пробовал?
это надо company() иметь внутри Owner. А что я там могу предложить?
public function company(): BelongsTo { return $this->car->mechanic->company(); }
кстати, работает! ⚡️
Плохая реализация. Здесь нужно оставить релейшен в car, далее в модели car релейшен на механика, а в модели механика - на компанию. Снаружи используется жадная загрузка: with('car.mechanic.company') И, в том числе, избавляемся от проблемы N+1 в запросах.
а разве with() не вернем нам билдер вместо релейшена?
https://laravel.com/docs/10.x/eloquent-relationships#eager-loading
Сам метод возвращает билдер, а вот результат запроса будет содержать загруженные релейшены
а... предлагается не писать релейшен для модели owner, а просто использовать жадную загрузку для получения данных.
Жадная загрузка загружает релейшены. Не писать их невозможно
я имею ввиду конкретный релейшен company для модели owner. все остальные релейшены, конечно, остаются
то есть return Owner::with('car.machanic.company')->find($owner->id)?->car?->machanic?->company лучше чем return Company::find($owner->car?->mechanic?->company_id)
а зачем делать Owner::find('$owner->id') ?)
Зачем грузить овнера, если уже есть его модель? $owner->car->mechanic->company
так... я не успеваю )) чем вот это лучше того, что было изначально?
https://t.me/laravel_web/1020267
ленивая загрузка нужна при массовой загрузке записей, ->get()
Стикер
Обсуждают сегодня