You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何将候选人查询结果转为全量数组或JSON以导出CSV

解决Laravel中获取全量搜索结果转数组/JSON用于CSV导出的问题

我明白你的需求:你现在需要把符合高级搜索条件的所有候选人数据(不是分页后的部分数据)转成数组或JSON,用来导出CSV,但之前用paginate(10)得到的结果包含分页链接等额外信息,不符合要求对吧?

核心修改步骤

  1. 替换分页方法为全量查询:把paginate(10)改成get(),这样就能获取所有符合条件的记录,而不是分页的10条数据。
  2. 调整总数计算逻辑:paginate()返回的分页实例有total()方法,但get()返回的是Collection,要用count()来获取总记录数。
  3. 修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:42:38