Laravel Eloquent:orderBy相关表

时间:2019-06-23 10:14:53

标签: laravel eloquent

我想按其他相关表上的字段排序雄辩的结果。 我有用户表。每个用户都有一个个人资料。个人资料已赞助(布尔值)字段。因此,当我想吸引所有用户时,我想先展示赞助用户,然后再展示非赞助用户。

public function profile(){
 return $this->hasOne('App\Doctor');
}

4 个答案:

答案 0 :(得分:0)

有两种方法: 1)您必须加入表格,

User::join('profiles','users.id','=','profile.user_id')->orderBy('sponsored','DESC')->get()

2)急于加载

User::with(array('profile' => function($query) {
        $query->orderBy('sponsored', 'DESC');
    }))
    ->get();

答案 1 :(得分:0)

尝试这个

User::leftJoin('profile', 'user.id', '=', 'profile.user_id')
    ->orderBy('profile.sponsored', 'ASC')
    ->get();

答案 2 :(得分:0)

我强烈建议您不要使用表联接,因为这将使您失去规模。

一个更好的解决方案是吸引用户,获取他们的个人资料,然后使用laravel收集方法对其进行排序。

您可以使用此示例来实现此解决方案。

//get all users
$users = User::all();
//extract your users Ids
$userIds = $users->pluck('id')->toArray();
//get all profiles of your user Ids
$profiles = Profile::whereIn('user_id', $userIds)->get()->keyBy('user_id');
//now sort users based on being sponsored or not
$users = $users->sort(function($item1, $item2) use ($profiles) {
  if($profiles[$item1->id]->sponsored == 1 && $profiles[$item2->id]->sponsored == 1){
    return 0;
  }
  if($profiles[$item1->id]->sponsored == 1) return 1;
  return -1;
});

您可以查看this link,该书说明了laravel集合的种类。

答案 3 :(得分:0)

$order = 'desc';
    $users = User::join('profile', 'users.id', '=', 'profile.id')
   ->orderBy('profile.id', $order)->select('users.*')->get();