laravel Lazy Eager正在加载orderBy相关模型

时间:2016-02-17 23:29:34

标签: php laravel model laravel-5

我需要懒得热切地加载一些带有自定义顺序的相关模型。类似的东西:

$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 个答案:

答案 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']);