Получение отношений отношений с помощью Eloquent в Laravel

У меня есть база данных со следующими таблицами и отношениями:

Объявление 1-1 Автомобиль m-1 Модель m-1 Марка

Если я хочу получить рекламу, я могу просто использовать:

Advert::find(1);

Если мне нужны детали машины, я могу использовать:

Advert::find(1)->with('Car');

Однако, если мне также нужны детали модели (в соответствии с отношениями с автомобилем), каков будет синтаксис, следующее не работает:

Advert::find(1)->with('Car')->with('Model');

Большое спасибо


person Ben Thompson    schedule 23.09.2013    source источник


Ответы (3)


Он находится в официальной документации в разделе "Активная загрузка".

Множественные отношения:

$books = Book::with('author', 'publisher')->get();

Вложенные отношения:

$books = Book::with('author.contacts')->get();

Итак, для вас:

Advert::with('Car.Model')->find(1);
person Björn    schedule 23.09.2013
comment
Ах отлично! +1 за ссылку на "Активная загрузка" - я прошел через раздел "Красноречие", но не нашел ответа на свой вопрос! - person Ben Thompson; 23.09.2013
comment
Должно ли это работать и для отношений hasMany? Он работает только для моих отношений hasOne / ownTo. - person Ben Thompson; 23.09.2013
comment
Ссылка на документацию теперь выглядит так: laravel.com/docs/5.5/eloquent-relationships# нетерпеливая загрузка в разделе "Вложенная активная загрузка" - person buzkall; 30.10.2017
comment
Advert::find(1)->with('Car.Model')->get(); фактически вернет все записи для рекламы в laravel 8. Advert::with('Car.Model')->find(1); вернет конкретную - person Bart Mommens; 07.01.2021

Для начала нужно создать свои отношения,

<?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;

Но поля вашей таблицы должны быть такими, потому что Laravel угадывает их таким образом:

id (for all tables)
car_id
model_id
brand_id

Или вам придется указать их в отношениях.

person Antonio Carlos Ribeiro    schedule 23.09.2013

Предположим, у вас есть 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();

}
person Harsh Gehlot    schedule 28.05.2020