2016-02-17 2 views
0

Мне нужна ленивая нетерпеливая загрузка некоторых связанных моделей по индивидуальному заказу. Что-то вроде:laravel Lazy Eager Загрузка с помощью заказа Связанная модель

$season->load(['championships' => function ($query) { 
    $query->orderBy('country', 'desc'); 
}]); 

Но проблема в том, что в чемпионатах нет собственности страны. В модели чемпионата я использую функцию getCountryAttribute:

public function getCountryAttribute() 
{ 
    return $this->masterChampionship->country; 
} 

public function masterChampionship() 
{ 
    return $this->belongsTo('App\MasterChampionship'); 
} 

И я получаю следующие результаты:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'country' in 'order clause' (SQL: select * from `championships` where `championships`.`season_id` in (41) order by `country` desc) 

Если я не использую нагрузки в чемпионатах контроллера и доступа из шаблона лезвия

@foreach($season->championships->sortBy('country') as $championship) 
    .... 
@endforeach 

все работает нормально. Но я хочу очистить шаблон и переместить логику в контроллер. Есть ли возможность решить мое дело с помощью встроенных функций laravel, не создавая пользовательский BD-запрос.

ответ

1

Youll должны изменить имена таблиц, так как я не знаю, что они есть, но я думаю, что это будет работать:

$season->load(['championships' => function($query){ 

    $query->select('championships.*') 
     ->join('master_championships', 'championships.master_championships_id', '=', 'master_championships.id') 
     ->orderBy('master_championships.country', 'desc'); 

}]); 

Я не думаю, что вы можете заказать запрос без использования присоединиться , видя, что вам нужно получить доступ к третьей таблице, чтобы получить атрибут country. Вы можете сэкономить кучу запросов от попадания в базу данных, если вы делаете

$season->load(['championships','championships.masterChampionships']); 
+0

все работает. Некоторые ошибки с названиями таблиц и колонок champions.master_championships_id -> champions.master_championship_id master_championships.country -> master_championships.country_id –

Смежные вопросы