laravel千万级数据导出方法
路由,admin.auth和auth不一样,laravel-admin就用qianwan者
Route::get('/qianwanji_daochu', [App\Admin\Controllers\QianwanDaochuController::class, 'index'])->middleware('admin.auth');
在laravel-admin 的列表中,增加一个按钮,这个是参数,值得注意filterParams
$grid = new Grid(new Scsym());
// 导出按钮(自动带筛选条件)
$grid->tools(function ($tools) {
$tools->append('
<a href="javascript:;" class="btn btn-sm btn-success" onclick="customExport()" style="margin-left:5px;">
🚀 千万级导出筛选数据
</a>
<script>
function customExport(){
let url = window.location.href;
let filterParams = url.split("?")[1] || "";
window.open("/qianwanji_daochu?"+filterParams, "_blank");
}
</script>
');
});
//筛选
$grid->filter(function(Grid\Filter $filter){
// 范围过滤器,调用模型的`onlyTrashed`方法,查询出被软删除的数据。
//根据批次查找
$filter->where(function ($query) {
$uid_list = Pcgl::query()->where('pc_bh', 'like', "%{$this->input}%")->select('id')->get()->toArray();
$query->whereIn('pc_id', $uid_list); //pc_id当前实例化模型中的关联id主键字段
}, '关联溯源码的批次编号');
//根据商户查找
qianwanji_daochu这个路由对应 的控制代码
<?php
namespace App\Admin\Controllers;
use Encore\Admin\Controllers\AdminController;
use Illuminate\Http\Request;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Show;
use App\Models\Symconfig;
use App\Models\Pcgl;
use \DB;
use SimpleSoftwareIOQrCodeFacadesQrCode;
use App\Admin\Actions\Restore;
use App\Admin\Actions\BatchRestore;
use App\Admin\Csvdaochu\Csvdc;
class QianwanDaochuController
{
public function index(Request $request)
{
session()->put('referer_token', true);
// dd(session()->has('referer_token') );
$pici = Pcgl::where('pc_bh', $request->pc_bh)->first();
if ($pici) {
$pc_id = $pici->id;
} else {
dd('批次编号有误');
}
return view('admin.qianwandaochu', ['pc_id' => $pc_id,'pcbh'=>$request->pc_bh]);
}
}
对应的blade
@php
//验证来路页面是否允许
// 验证令牌是否存在
if (!session()->has('referer_token')) {
abort(403, '未授权访问!');
}
// ============== 配置区(php7和php8适用)==============
// 数据库配置
$host = config('database.connections.mysql.host');
$dbname = config('database.connections.mysql.database');
$username = config('database.connections.mysql.username');
$password = config('database.connections.mysql.password');
$table = 'cbsy_sym'; // 指定要查询的表
// 数据库字段 + 自定义中文表头(一一对应)
$fields = ['id', 'pc_id', 'code', 'ci', 'created_at'];
$headers = ['ID', '批次ID', '防伪码', '查询次数', '创建时间'];
// 防科学计数法:长数字字段(id、手机号、订单号等)
$number_fields = ['id', 'code'];
// SQL 查询条件
//$where = "c_id = 11 AND pc_name = 'A产品'";
$where = "pc_id = {$pc_id}";
// ================================================
// 运行配置
set_time_limit(0);
ini_set('memory_limit', '256M');
ini_set('output_buffering', 'Off');
error_reporting(0); // 关闭所有警告/通知
// 清空输出缓冲区
while (ob_get_level()) {
ob_end_clean();
}
// 浏览器下载头
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=防伪码_' .$pcbh. date('YmdHis') . '.csv');
header('Cache-Control: no-cache');
// 拼接SQL
$fieldStr = implode(',', $fields);
try {
// PDO 连接(全版本兼容)
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$username,
$password,
array(
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
)
);
// 执行查询
$sql = "SELECT $fieldStr FROM $table WHERE $where";
$stmt = $pdo->query($sql);
$fp = fopen('php://output', 'w');
// UTF-8 BOM 解决Excel乱码
fwrite($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
// ====================== 修复点1:补全fputcsv参数 ======================
// 写入表头(显式传分隔符、包裹符、转义符,消除弃用警告)
fputcsv($fp, $headers, ',', '"', '\\');
// 流式输出数据
while ($row = $stmt->fetch()) {
// 【1】清理所有字段的空格/不可见字符(解决Excel提示)
foreach ($row as $key => $value) {
$row[$key] = trim((string)$value);
}
// 【2】处理长数字,防科学计数法(替换\t,彻底无多余字符)
foreach ($number_fields as $nf) {
if (isset($row[$nf])) {
// 去掉\t,用Excel原生文本格式,无任何多余字符
$row[$nf] = '="' . $row[$nf] . '"';
}
}
// 写入数据行(无PHP8.4警告)
fputcsv($fp, $row, ',', '"', '\\');
}
fclose($fp);
} catch (Exception $e) {
die("导出失败:" . $e->getMessage());
}
exit;
@endphp
最近访问时间:2026-04-01 00:59:23