Laravel中如何将候选人查询结果转为全量数组或JSON以导出CSV
解决Laravel中获取全量搜索结果转数组/JSON用于CSV导出的问题
我明白你的需求:你现在需要把符合高级搜索条件的所有候选人数据(不是分页后的部分数据)转成数组或JSON,用来导出CSV,但之前用paginate(10)得到的结果包含分页链接等额外信息,不符合要求对吧?
核心修改步骤
- 替换分页方法为全量查询:把
paginate(10)改成get(),这样就能获取所有符合条件的记录,而不是分页的10条数据。 - 调整总数计算逻辑:
paginate()返回的分页实例有total()方法,但get()返回的是Collection,要用count()来获取总记录数。 - 修复SQL注入风险:你的
whereRaw直接拼接用户输入,存在安全隐患,必须改成参数绑定的形式。
修改后的完整代码
public function advance(Request $request) { $data1 = ['LoggedUserInfo'=>Admin::where('id','=', session('LoggedUser'))->first()]; $data = \DB::table('candidates'); // 原有搜索条件逻辑不变 if( $request->name){ $data = $data->where('name', 'LIKE', "%" . $request->name . "%"); } if( $request->location){ $data = $data->where('location', 'LIKE', "%" . $request->location . "%"); } if( $request->key_skills){ $data = $data->where('key_skills', 'LIKE', "%" . $request->key_skills . "%"); } if( $request->gender){ $data = $data->where('gender', 'LIKE', "%" . $request->gender . "%"); } if( $request->pref_loc){ $data = $data->where('pref_loc', 'LIKE', "%" . $request->pref_loc . "%"); } if( $request->phoneno){ $data = $data->where('phoneno', 'LIKE', "%" . $request->phoneno . "%"); } if( $request->email){ $data = $data->where('email', 'LIKE', "%" . $request->email . "%"); } // 修复SQL注入:用参数绑定替代直接拼接变量 $min_np = $request->min_np; $max_np = $request->max_np; if ($min_np || $max_np) { $data = $data->whereRaw("CONVERT(SUBSTRING_INDEX(notice_period,' ', 1),UNSIGNED INTEGER) >= ?", [$min_np]); $data = $data->whereRaw("CONVERT(SUBSTRING_INDEX(notice_period,' ', 1),UNSIGNED INTEGER) <= ?", [$max_np]); } $min_ctc = $request->min_ctc; $max_ctc = $request->max_ctc; if ($min_ctc || $max_ctc) { $data = $data->whereRaw("CONVERT(SUBSTRING_INDEX(salary,' ', 1),UNSIGNED INTEGER) >= ?", [$min_ctc]); $data = $data->whereRaw("CONVERT(SUBSTRING_INDEX(salary,' ', 1),UNSIGNED INTEGER) <= ?", [$max_ctc]); } if ($request->min_exp || $request->max_exp) { $data = $data->whereRaw("CONVERT(SUBSTRING_INDEX(experrience,' ', 1),UNSIGNED INTEGER) >= ?", [$request->min_exp]); $data = $data->whereRaw("CONVERT(SUBSTRING_INDEX(experrience,' ', 1),UNSIGNED INTEGER) <= ?", [$request->max_exp]); } // 关键修改:用get()获取全量数据,替代paginate(10) $data = $data->get(); // 调整总数计算:用count()替代total() $data2 = $data->count(); // 现在toJson()返回的是全量数据的JSON,无分页信息 $dataa = $data->toJson(); // 如果需要数组,用下面的代码 // $dataArray = $data->toArray(); $data4 = \DB::table('admins')->get(); $setting = DB::select('select * from logo where id=?',[1]); // 如果你是要直接导出CSV,可以在这里处理,不用返回视图 // 示例CSV导出逻辑: /* if ($data->isNotEmpty()) { $headers = array_keys($data->first()->toArray()); $csv = implode(',', $headers) . "\n"; foreach ($data as $row) { $csv .= implode(',', array_values($row->toArray())) . "\n"; } return response($csv) ->header('Content-Type', 'text/csv') ->header('Content-Disposition', 'attachment; filename="candidates.csv"'); } */ return view('search', compact('data2','data4','setting','dataa'))->with('data',$data); }
额外说明
- 如果只需要全量数组,调用
$data->toArray()即可,返回的是包含所有记录的多维数组。 - 关于CSV导出:上面的代码里加了一个简单的导出示例,你可以直接用这个逻辑替代返回视图的部分,这样用户点击搜索后就能直接下载CSV文件了。
- 为什么要修复SQL注入:直接把用户输入的
$min_np等变量拼进SQL语句,攻击者可以构造恶意输入来执行任意SQL,参数绑定是Laravel提供的安全机制,一定要用上。
内容的提问来源于stack exchange,提问作者newdevv2
相关产品推荐
相关产品推荐

