Laravel Eloquent: таблица связанных заказов - PullRequest
0 голосов
/ 23 июня 2019

Я бы хотел упорядочить результат eloquent по полю в другой связанной таблице. У меня есть таблица пользователей. У каждого пользователя есть один профиль. Профиль спонсирует (это логическое) поле. Поэтому, когда я хочу получить всех пользователей, я хочу отобразить сначала спонсируемых пользователей, а затем не спонсируемых.

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

Ответы [ 4 ]

0 голосов
/ 25 июня 2019
$order = 'desc';
    $users = User::join('profile', 'users.id', '=', 'profile.id')
   ->orderBy('profile.id', $order)->select('users.*')->get();
0 голосов
/ 23 июня 2019

Попробуйте это

User::leftJoin('profile', 'user.id', '=', 'profile.user_id')
    ->orderBy('profile.sponsored', 'ASC')
    ->get();
0 голосов
/ 23 июня 2019

Я настоятельно рекомендую не использовать объединения таблиц, так как это приведет к неудаче в масштабе.

Лучшее решение - получить пользователей, получить их профили, а затем отсортировать их, используя методы сбора данных 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;
});

Вы можете проверить эту ссылку , которая объясняет сортировку коллекции Laravel.

0 голосов
/ 23 июня 2019

Есть два способа: 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...