Пагинация создает ошибку

0

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

    $productsQuery = Product::where('approved', '=', 1)->leftJoin('reviews', 'reviews.products_id', '=', 'products.id')->select('products.*', DB::raw('AVG(ratings) as ratings_average' ))->groupBy('id')->orderBy('ratings_average', 'DESC');

Я добавляю к этому ссылку, как показано в документах

    $productsQuery = Product::where('approved', '=', 1)->leftJoin('reviews', 'reviews.products_id', '=', 'products.id')->select('products.*', DB::raw('AVG(ratings) as ratings_average' ))->groupBy('id')->orderBy('ratings_average', 'DESC')->paginate(18);

И получить ошибку

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in group statement is ambiguous

Любые идеи о том, как развернуть формулировку?

  • 0
    Нет, нет, нет ... Вместо этого используйте правильные отношения и энергичную загрузку. Вы все обдумываете.
Теги:
laravel-5.4

2 ответа

0

Ошибка здесь довольно понятна:

Column 'id' in group statement is ambiguous

поэтому вам нужно сделать

'groupBy('id')' 

более явным образом, указав, какой id (из какой таблицы, как каждая таблица используется в столбце id запроса), вы хотите использовать для группировки.

  • 0
    «В настоящее время операции разбиения на страницы, использующие оператор groupBy, не могут быть эффективно выполнены Laravel. Если вам нужно использовать groupBy с разбитым на страницы набором результатов, рекомендуется выполнить запрос к базе данных и создать paginator вручную». взяты из документов. как бы я это сделал?
  • 0
    это не означает, что он не работает, но он работает менее эффективно, чем без использования groupBy() . В любом случае это может быть проблемой, но вам нужно это проверить. Custom paginator задокументирован в официальных документах
0

Это не обязательно разбиение на страницы, вызывающее проблему, ошибка вызвана вашей группой.

Вы должны поместить имя таблицы/псевдонима перед идентификатором EG:

 $productsQuery = Product::where('approved', '=', 1)->leftJoin('reviews', 'reviews.products_id', '=', 'products.id')->select('products.*', DB::raw('AVG(ratings) as ratings_average' ))->groupBy('product.id OR reviews.id')->orderBy('ratings_average', 'DESC');

См. Вышеприведенное выражение, обратите внимание, что копирование, вставляемое в него, не будет работать, вы увидите изменение этого аргумента groupby.

Вы также должны посетить документы на Eloquent, вы подошли к этому так, чтобы сражаться с laravel. Я бы предложил получить более жесткое сцепление с используемым ORM.

Удачи!

  • 0
    Группа работает без нумерации страниц, так что это определенно причина ошибки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню