OrderBy on Eloquent whereHas 关系

OrderBy on Eloquent whereHas relationship

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

我目前有以下 eloquent 查询;

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

我认为你不能对子查询进行排序,它应该在 ->get

之前

当您想显示结果时,试试这个:

@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

尝试使用您的模型和关系来获得尽可能轻的控制器,您将获得灵活性

要保留它 eloquent,你可以把它放在关系中,在模型中 class:

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 搜索中的第一个)

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