laravel中的多重优先级排序

时间:2018-04-23 06:21:10

标签: laravel sorting laravel-5

我已经在互联网上阅读了很多相关内容,但它看起来像是一个不同的问题。所以...我拥有的是:

$students = User::with('user_profile')
             ->whereHas('roles', function($query){
                 return $query->where('slug', 'student');
             })->get()
             ->sortBy(function($user){
                 return $user->user_profile->country;
             });

是的,这可以用来按国家排序students,但是如果他们有相同的国家/地区,我想要排序的第二个字段是他们的名字,所以我尝试了这个:

$students = User::with('user_profile')
                 ->whereHas('roles', function($query){
                     return $query->where('slug', 'student');
                 })->get()
                 ->sortBy(function($user){
                     return $user->user_profile->country;
                 })
                 ->sortBy(function($user){
                     return $user->user_profile->first_name;
                 });

然后尝试更改国家/地区,现在,它只能排序名字而不是国家/地区(这是我在第一个名称之前排序的优先级字段)。

顺便说一下,我正在使用Laravel 5.1

干杯!

1 个答案:

答案 0 :(得分:0)

这有点违反直觉,但是当您在Eloquent中链接sortBy时,它们会被反向应用。 因此,您的示例代码实际上是"按名字排序,然后按国家/地区排序"。

其他可能的解决方案是连接您要排序的两个字段:

$students = User::with('user_profile')
             ->whereHas('roles', function($query){
                 return $query->where('slug', 'student');
             })->get()
             ->sortBy(function($user){
                 return $user->user_profile->country . "-". $user->user_profile->first_name;
             })