0

I need to lazy eager load some related models with custom order. Something like:

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

But the problem is that championships do not have country property. In Championship model I use getCountryAttribute function:

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

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

And I get next results:

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)

If i don't use load in controller and access championships from blade template

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

everything works fine. But I want to cleanup template and move logic to controller. Is there any possibility to solve my case using built-in laravel features, without building custom BD query.

1 Answer 1

1

Youll have to change the table names, as I don't know what they are, but I think this would work:

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

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

}]);

I don't think you can order the query without using a join, seeing as you have to access the third table to get the country attribute. You may save a bunch of queries from hitting the database if you do

$season->load(['championships','championships.masterChampionships']);
Sign up to request clarification or add additional context in comments.

1 Comment

everything works. Some mistakes with table and columns names championships.master_championships_id -> championships.master_championship_id master_championships.country -> master_championships.country_id

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.