Получение отношений отношений с помощью Eloquent в Laravel
У меня есть база данных со следующими таблицами и отношениями:
Объявление 1-1
Автомобиль m-1
модель m-1
марка
Если я хочу получить объявление, я могу просто использовать:
Advert::find(1);
Если я хочу детали машины, я мог бы использовать:
Advert::find(1)->with('Car');
Однако, если я также хочу подробно описать модель (следуя отношениям с Car), каким будет синтаксис, следующее не сработает:
Advert::find(1)->with('Car')->with('Model');
Большое спасибо
4 ответа
Это в официальной документации в разделе "Eager Loading"
Несколько отношений:
$books = Book::with('author', 'publisher')->get();
Вложенные отношения:
$books = Book::with('author.contacts')->get();
Итак, для вас:
Advert::find(1)->with('Car.Model')->get();
Сначала вам нужно создать свои отношения,
<?php
class Advert extends Eloquent {
public function car()
{
return $this->belongsTo('Car');
}
}
class Car extends Eloquent {
public function model()
{
return $this->belongsTo('Model');
}
}
class Model extends Eloquent {
public function brand()
{
return $this->belongsTo('Brand');
}
public function cars()
{
return $this->hasMany('Car');
}
}
class Brand extends Eloquent {
public function models()
{
return $this->hasMany('Model');
}
}
Тогда вам просто нужно получить доступ к этому пути:
echo Advert::find(1)->car->model->brand->name;
Но поля вашей таблицы должны быть, потому что Ларавел угадал их так:
id (for all tables)
car_id
model_id
brand_id
Или вам придется указать их в отношениях.
добавит функцию отношения, просто попросит необходимое отношение
public function Car()
{
return $this->belongsTo(Car::class, 'car_id')->with('Model');
}
но если вы хотите вложенное отношение, просто используйте точку в with
Advert::with('Car.Model')->find(1);
но для множественных отношений используйте массив
Advert::with('Car','Model')->find(1);
Предположим, у вас есть 3 модели региона, города, отелей и, чтобы получить все отели с городом и регионом, тогда
Определите в них отношения следующим образом:
Hotel.php
class Hotel extends Model {
public function cities(){
return $this->hasMany(City::class);
}
public function city(){
return $this->belongsTo('App\City','city_id');
}
}
City.php
class City extends Model {
public function hotels(){
return $this->hasMany(Hotel::class);
}
public function regions(){
return $this->belongsTo('App\Region','region_id');
}
}
Region.php
class Region extends Model
{
public function cities(){
return $this->hasMany('App\City');
}
public function country(){
return $this->belongsTo('App\Country','country_id');
}
}
HotelController.php
public function getAllHotels(){
// get all hotes with city and region
$hotels = Hotel::with('city.regions')->get()->toArray();
}