如何将许多语句 mysql 转换为 laravel eloquent?
How can I convert many statement mysql to laravel eloquent?
Mysql 像这样查询:
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;
我想将其转换为 laravel eloquent,但我很困惑。因为存在很多语句。存在PREPARE
、EXECUTE
、SET
、DEALLOCATE
等,可以看上面的查询
如何将其转换为 laravel eloquent?
主要是原始查询:
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');
试试这个:
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();
这似乎是重复的 ()。
您在另一个线程上请求并获得了帮助,但在这里询问如何实际实施他们在那里给出的答案。 (而且我可能会补充说,在询问时相当好斗。)
通常最好要求澄清你得到的代码,作为给出问题的答案。
您应该将您的查询作为 Mysql 过程并 运行 它针对您的数据库,我在下面对您的查询做了一些微调,
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 ;
然后使用查询生成器方法从 Laravel 控制器调用您的过程,
$queryResult = $db->prepare('call searchitems()');
$queryResult->execute();
$results = $queryResult->fetchAll(PDOConnection::FETCH_ASSOC);
$queryResult->closeCursor();
然后把你的结果集转换成Laravelcollection,这样就可以很方便的分页了,
$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']));
然后return这样查看
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);
并且在您的 blade 视图模板中,您可以在 foreach 循环中访问数据并在 table 或列表视图中呈现,
要显示分页,你可以这样做
//to render pagination is front end
<div class="row">
<div class="col-md-offset-4">
<?php echo $results->render(); ?>
</div>
</div>
但是我建议您缓存数据以避免重复调用过程并提高性能,因为如果您有数百万数据,这种构建分页的方式会减慢您的应用程序,
如果你需要实现 Ajax 分页,
你可以参考 this article
Mysql 像这样查询:
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;
我想将其转换为 laravel eloquent,但我很困惑。因为存在很多语句。存在PREPARE
、EXECUTE
、SET
、DEALLOCATE
等,可以看上面的查询
如何将其转换为 laravel eloquent?
主要是原始查询:
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');
试试这个:
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();
这似乎是重复的 (
您在另一个线程上请求并获得了帮助,但在这里询问如何实际实施他们在那里给出的答案。 (而且我可能会补充说,在询问时相当好斗。)
通常最好要求澄清你得到的代码,作为给出问题的答案。
您应该将您的查询作为 Mysql 过程并 运行 它针对您的数据库,我在下面对您的查询做了一些微调,
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 ;
然后使用查询生成器方法从 Laravel 控制器调用您的过程,
$queryResult = $db->prepare('call searchitems()');
$queryResult->execute();
$results = $queryResult->fetchAll(PDOConnection::FETCH_ASSOC);
$queryResult->closeCursor();
然后把你的结果集转换成Laravelcollection,这样就可以很方便的分页了,
$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']));
然后return这样查看
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);
并且在您的 blade 视图模板中,您可以在 foreach 循环中访问数据并在 table 或列表视图中呈现, 要显示分页,你可以这样做
//to render pagination is front end
<div class="row">
<div class="col-md-offset-4">
<?php echo $results->render(); ?>
</div>
</div>
但是我建议您缓存数据以避免重复调用过程并提高性能,因为如果您有数百万数据,这种构建分页的方式会减慢您的应用程序, 如果你需要实现 Ajax 分页, 你可以参考 this article