laravel千万级数据导出方法
xuexi 2026-03-31 14:59:47 发表在:PHP 查看数:14

路由,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
知识库:433条鸣谢:TAY  备案号:蜀ICP备2024090044号