Список SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец explore.ratings.id. - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь выбрать поездки, а затем сгруппировать их по ставке.

примечание: рейтинги - это полиморфные отношения

учитывая, что у нас есть 2 модели:

trips
  id => int
  price => float
  city_id => uint
........

ratings:
  id => int
  ratable_id => int
  ratable_type=> varchar
  rate => small-int
......

и вот как я пытаюсь это сделать:

\App\Models\Trip::where('price','>=','100')->with(['ratings' => function ($query) {
        $query->groupBy('ratings.rate');
    }])->get();

и Whoops!:

"SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1055 выражение # 1 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированные столбец explore.ratings.id, который функционально не зависит от столбцы в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by (SQL: выберите * из ratings, где ratings. ratable_id in (1, 2) и ratings. ratable_type = Приложение \ Модели \ Группа поездок ratings. rate)

1 Ответ

0 голосов
/ 28 июня 2018

Используйте другой подход:

$grouped = [];
$trips = \App\Models\Trip::where('price', '>=', '100')->with('ratings')->get();
foreach($trips as $trip) {
    foreach($trip->ratings as $rating) {
        $grouped[$rating->rate][] = $trip;
    }
}

Или используйте JOIN:

$trips = \App\Models\Trip::select('trips.*', 'ratings.rate')
    ->join('ratings', 'ratings.ratable_id', 'trips.id')
    ->where('ratings.ratable_type', 'App\Models\Trip')
    ->where('trips.price', '>=', '100')
    ->get();
$grouped = $trips->groupBy('rate');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...