Laravel中Blade展示及PDF打印3万条数据的问题求助
解决方案
一、Blade视图保留分页展示
继续用分页给用户浏览,避免页面加载卡顿:
// 控制器代码 $accounts = Acc_account::where('cat', 2)->paginate(200); return view('accounts.index', compact('accounts'));
Blade里正常渲染分页导航和当前页数据就行,用户浏览完全没问题。
二、单独处理全量数据的PDF打印
分页数据只能拿当前页,要打全部3万条得单独查,但得优化查询避免内存溢出:
1. 用游标查询替代get()
Laravel的游标查询会逐条拉取记录,不会一次性把所有数据塞进内存,适配大数据量场景:
// 新增PDF打印的控制器方法 public function printPdf() { // 只查需要的字段,别用select('*'),能省不少内存 $accounts = Acc_account::where('cat', 2)->select('id', 'name', 'balance')->cursor(); // 转成集合方便视图遍历 $accountsList = collect($accounts); // 用PDF库(比如dompdf)加载视图生成PDF $pdf = PDF::loadView('accounts.pdf', compact('accountsList')); return $pdf->download('all-accounts.pdf'); }
2. PDF视图遍历数据
在accounts.pdf视图里直接循环数据就行:
<table border="1"> <thead> <tr> <th>ID</th> <th>账户名称</th> <th>余额</th> </tr> </thead> <tbody> @foreach($accountsList as $account) <tr> <td>{{ $account->id }}</td> <td>{{ $account->name }}</td> <td>{{ $account->balance }}</td> </tr> @endforeach </tbody> </table>
三、进阶优化方案
如果游标还是有内存压力,试试分块拼接HTML生成PDF:
public function printPdf() { $html = '<table border="1"><thead><tr><th>ID</th><th>名称</th><th>余额</th></tr></thead><tbody>'; // 每次查1000条,循环拼接HTML Acc_account::where('cat', 2)->select('id', 'name', 'balance')->chunk(1000, function ($chunk) use (&$html) { foreach ($chunk as $account) { $html .= "<tr><td>{$account->id}</td><td>{$account->name}</td><td>{$account->balance}</td></tr>"; } }); $html .= '</tbody></table>'; $pdf = PDF::loadHTML($html); return $pdf->download('all-accounts.pdf'); }
另外,查询时可以关闭模型事件进一步提升性能:
Acc_account::withoutEvents()->where('cat', 2)->select(...)->cursor();
内容的提问来源于stack exchange,提问作者Shady Hesham
相关产品推荐
相关产品推荐

