订单在Eloquent里有关系

时间:2017-05-10 09:05:14

标签: laravel eloquent laravel-eloquent

我有一个简单的页面,列出了县和标题下的相关项目。这些项目必须是approved,因此是whereHas方法。

我目前有以下雄辩的查询;

$counties = County::whereHas('items', function ($query) {
    $query->where('approved', 1);
})->get();

返回的items目前按其主要字段id排序(看起来似乎),但我希望按name字段的字母顺序列出这些项目。

我已尝试过以下查询,但这确实会改变任何内容。任何建议都会受到赞赏吗?

$counties = County::whereHas('items', function ($query) {
    $query->where('approved', 1)->orderBy('name');
})->get();

4 个答案:

答案 0 :(得分:4)

$counties = County::whereHas('items', function ($query) {
    $query->where('approved', 1);
})->orderBy('name')->get();

我不认为你可以在子查询上订购,它应该在 - > get

之前

答案 1 :(得分:1)

如果要显示结果,请尝试以下操作:

@foreach($counties as $county)
    @foreach($county->items->orderBy('name') as $item)
          {{ $item->name }}
    @endforeach
@endforeach

或者在您的县模型中:

public function approvedItems(){
    return $this->hasMany(Item::class)->where('approved', 1)->orderBy('name');
}

然后:

控制器:

$counties = County::whereHas('approvedItems')->get();

观点:

@foreach($counties as $county)
    @foreach($county->approvedItems as $item)
          {{ $item->name }}
    @endforeach
@endforeach

尝试使用您的模型和关系来拥有最轻的控制器,您将获得灵活性

答案 2 :(得分:1)

$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');

答案 3 :(得分:0)

要保持口才,可以将其放在Model类的关系中:

public function reviews()
{
    return $this->hasMany(Review::class)->orderBy('id','desc');
}

https://laravel.io/forum/09-14-2015-ordering-a-collection-by-the-related-items

可能会迟到,但希望有人偶然发现(这是Google搜索中的第一个)