Como posso converter muitas instruções mysql para laravel eloquente?

Consulta mysql como esta:

SELECT GROUP_CONCAT(DISTINCT CONCAT( 'ifnull(SUM(case when location_code = ''', location_code , ''' then quantity end),0) AS `', location_code , '`' ) ) INTO @sql FROM item_details; SET @sql = CONCAT('SELECT item_number,SUM(quantity) as "total_quantity", ', @sql, ' FROM item_details GROUP BY item_number'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

Eu quero convertê-lo para laravel eloquente, mas estou confuso. Porque existem muitas declarações. Existem PREPARE , EXECUTE , SET , DEALLOCATE , etc. Você pode ver a consulta acima

Como posso convertê-lo para laravel eloquente?

São principalmente consultas cruas:

 DB::table('item_details')->selectRaw('GROUP_CONCAT(...) INTO @sql')->get(); DB::statement('SET @sql = CONCAT(...)'); DB::statement('PREPARE stmt FROM @sql'); DB::statement('EXECUTE stmt'); DB::statement('DEALLOCATE PREPARE stmt'); 

Tente isto:

 DB::table('item_details')->selectRaw('GROUP_CONCAT(...) INTO @sql')->get(); $sql = DB::selectOne('select @sql')->{'@sql'}; ItemDetails::select('item_number', DB::raw('SUM(quantity) as total_quantity')) ->selectRaw($sql) ->groupBy('item_number') ->get(); 

Você deve fazer sua consulta como um procedimento Mysql e executá-lo em seu database, fiz um pequeno ajuste na sua consulta abaixo,

 DROP PROCEDURE IF EXISTS searchitems; DELIMITER $$ CREATE PROCEDURE searchitems() BEGIN SET @@group_concat_max_len = 75000; SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(CASE WHEN location_code = ''', location_code, ''' THEN coalesce(quantity, 0) END) AS `', location_code, '`' ) ) INTO @sql FROM item_details; SET @query := CONCAT('SELECT item_number,SUM(quantity) as "total_quantity", ', @sql, ' FROM item_details GROUP BY item_number'); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @@group_concat_max_len = 1024; END $$ DELIMITER ; 

em seguida, chame seu procedimento do controlador Laravel usando a Abordagem do Construtor de Consultas como essa,

 $queryResult = $db->prepare('call searchitems()'); $queryResult->execute(); $results = $queryResult->fetchAll(PDOConnection::FETCH_ASSOC); $queryResult->closeCursor(); 

então converta seu conjunto de resultados em coleção Laravel, então você pode facilmente fazer paginação assim,

  $results_collection = collect($results); $currentPage = LengthAwarePaginator::resolveCurrentPage(); $perPage = 20; $currentPageSearchResults = $results_collection->slice(($currentPage - 1) * $perPage, $perPage)->all(); $paginatedSearchResults = new LengthAwarePaginator($currentPageSearchResults, count($results_collection), $perPage); $paginatedSearchResults->setPath($request->url()); $paginatedSearchResults->appends($request->except(['page'])); 

em seguida, voltar a ver como este

  return view('yourview') ->with('results',$paginatedSearchResults); //or if ajax call $viewData = view('yourview') ->with('results',$paginatedSearchResults) ->render(); $response = [ "Status" => "Success", "Content" => $viewData ]; return response()->json($response); 

e no seu modelo de visão de lâmina, você pode acessar os dados em um loop foreach e renderizar na tabela ou exibição de lista, para exibir a paginação, você pode fazer como este

 //to render pagination is front end 
render(); ?>

No entanto, aconselho a colocação em cache dos dados para evitar repetidas chamadas ao procedimento e aumentar o desempenho, uma vez que esta forma de construir a paginação irá abrandar a sua aplicação se tiver milhões de dados, se necessitar de implementar a paginação Ajax, pode consultar este artigo

Isto parece ser uma duplicata ( Como criar campos dynamics selecionados de uma tabela no mysql? ).

Você pediu e recebeu assistência no outro tópico, mas está perguntando aqui como implementar efetivamente a resposta que eles deram lá. (E tenho sido bastante combativo em perguntar, devo acrescentar).

Geralmente é melhor pedir esclarecimentos sobre o código que você obteve como resposta na pergunta em que foi dado.