При использовании разбиения на страницы laravel возникает ошибка SQL

#php #sql-server #laravel #pagination

Вопрос:

Проблема в том, что я установил связь между 3 таблицами и хочу отобразить результат в представлении, сгруппировав его только по штрих-коду.

Моя функция контроллера заключается в следующем;

 public function index(Request $request){
         $data = DB::table('orderItems as SS')
            ->select(DB::raw('SS.barcode,
                MAX(SS.productName) as productName,
                SUM(SS.quantity) as quantity,
                COALESCE(NULLIF(MAX(B.salePrice),0),  MAX(B.regularPrice)) as unitPrice'))
            ->leftJoin('products as B','SS.barcode', '=', 'B.barcode')
            ->leftJoin('orders as S', 'SS.orderID', '=', 'S.ID')
            ->whereBetween('S.orderDate', ['20210616', '20210616'])
            ->orderBy('quantity', 'DESC')
            ->groupBy('SS.barcode')
            ->limit(1000)
            ->simplePaginate(5);

        return view('rapor', compact('data'));
    }
 

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

 SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server]
[SQL Server]Column 'orderItems.quantity' is invalid in the select list 
because it is not contained in either an aggregate function or the GROUP BY clause. 
(SQL: select * from (select SS.barcode, MAX(SS.productName) as productName, 
SUM(SS.quantity) as quantity, COALESCE(NULLIF(MAX(B.salePrice),0), 
MAX(B.regularPrice)) as unitPrice, 
COALESCE(NULLIF(SUM(B.salePrice * SS.quantity),0), 
row_number() over (order by [quantity] desc) as row_num from [orderItems] as [SS] 
left join [products] as [B] on [SS].[barcode] = [B].[barcode] 
left join [orders] as [S] on [SS].[orderID] = [S].[ID] where [S].[orderDate] 
between 20210616 and 20210616 group by [SS].[barcode]) as temp_table where row_num between 6 and 11 order by row_num)
 

Если я использую ->groupBy('SS.barcode','quantity') разбиение на страницы, это работает, но на самом деле не дает желаемого результата, потому что он группируется как по штрих-коду, так и по количеству. в этом состоянии он отображает более одной записи из продукта.

Примеры результатов;

->groupBy('SS.barcode') результаты : https://prnt.sc/16ke2sv

->groupBy('SS.barcode','quantity') результаты: https://prnt.sc/16kehdl

Как я уже сказал, разбиение на страницы работает в форме второй группировки, но, как вы можете видеть, количества не совпадают.

Что я делаю не так, если разбиение на страницы возможно только путем группировки по штрих-коду?

Ответ №1:

ROW_NUMBER() OVER (ORDER BY SUM(quantity) DESC) AS rownumber, достаточно было просто добавить эту строку и удалить ->orderBy('quantity', 'DESC') команду.

вот решение;

 public function index(Request $request){
         $data = DB::table('orderItems as SS')
            ->select(DB::raw('SS.barcode,
                MAX(SS.productName) as productName,
                SUM(SS.quantity) as quantity,
                ROW_NUMBER() OVER (ORDER BY SUM(quantity) DESC) AS rownumber,
                COALESCE(NULLIF(MAX(B.salePrice),0),  MAX(B.regularPrice)) as unitPrice'))
            ->leftJoin('products as B','SS.barcode', '=', 'B.barcode')
            ->leftJoin('orders as S', 'SS.orderID', '=', 'S.ID')
            ->whereBetween('S.orderDate', ['20210616', '20210616'])
            ->groupBy('SS.barcode')
            ->limit(1000)
            ->simplePaginate(5);

        return view('rapor', compact('data'));
    }