@mrSeller

Как правильно отсортировать выборку по связанной таблице?

Есть таблица users:
- id
- name

Таблица drivecat_user:
- drivecat_id
- user_id

Таблица rating:
- id
- user_id
- total // помимо total есть еще много других значений, но total - их сумма и по ней идет сортировка

Вот краткий код выборки без лишнего:
$users = User::where('city_id', $city_id);
  if ( $request->drivecats ) {
    $drivecats = explode(',', $request->drivecats);
    $users_id = DrivecatUser::whereIn('drivecat_id', $drivecats)->pluck('user_id');
    $users = $users->whereIn('id', $users_id);
  } else {
    $users = $users->has('drivecats')->with('drivecats');
  }


Вот код сортировки:
$users = $users
    ->with('rating')
    ->join('rating', 'users.id', '=', 'rating.user_id')
    ->orderBy('rating.total', 'desc')
    ->paginate(12);


До того, как я подключил сортировку, с выборкой никаких проблем не было.
Как только я подключил ее, то в первом случае выборки (с $request->drivecats) вылезает вот такая ошибка:
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous (SQL: select count(*) as aggregate from `users` inner join `rating` on `users`.`id` = `rating`.`user_id` where `city_id` = 4 and `id` in (2, 8, 14, 16))


Если убрать из выборки строку $users = $users->whereIn('id', $users_id), то все опять в порядке (но, естественно, результат уже не тот).

Как исправить данную ситуацию?
Проблема в сортировке или все-таки в выборке?
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
coderisimo
@coderisimo
я не ларавельщик, но судя по тексту ошибки вот здесь $users = $users->whereIn('id', $users_id); нужно конкретизировать что за id ? например, `users`.`id`
надеюсь , суть ясна.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Пример из гугла
$categories = Category::select(DB::raw('categories.*, count(*) as `aggregate`'))
    ->join('pictures', 'categories.id', '=', 'pictures.category_id')
    ->groupBy('category_id')
    ->orderBy('aggregate', 'desc')
    ->paginate(10);


В гугле есть ВСЕ
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы