Получение отношений отношений с помощью 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();

}
Другие вопросы по тегам