我需要懒得热切地加载一些带有自定义顺序的相关模型。类似的东西:
$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查询。
答案 0 :(得分:1)
你必须更改表名,因为我不知道它们是什么,但我认为这样可行:
$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']);