#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'));
}