我想按其他相关表上的字段排序雄辩的结果。 我有用户表。每个用户都有一个个人资料。个人资料已赞助(布尔值)字段。因此,当我想吸引所有用户时,我想先展示赞助用户,然后再展示非赞助用户。
public function profile(){
return $this->hasOne('App\Doctor');
}
答案 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();