Laravel+Yajra Datatables:循环生成日期列及数组传参问题
解决方案
1. 循环自动生成Day 1到Day 31的列
前端(JavaScript)
在Datatables初始化时,通过循环动态构建columns数组,无需手动逐个添加:
$(document).ready(function() { // 先定义固定列,比如基础信息列 let columns = [ { data: 'name', title: '姓名' }, { data: 'employee_id', title: '员工ID' } ]; // 循环生成Day 1到Day 31的列配置 for (let i = 1; i <= 31; i++) { columns.push({ data: `day_${i}`, title: `Day ${i}`, // 可按需添加排序、搜索等配置 sortable: false, searchable: false }); } // 初始化Datatables $('#datatable').DataTable({ processing: true, serverSide: true, ajax: { url: '/your-datatables-endpoint', type: 'POST', data: function(d) { // 传递数组格式的tgl参数示例 d.tgl = ['2024-05-01', '2024-05-02', '2024-05-31']; } }, columns: columns }); });
后端(Laravel控制器)
在Yajra Datatables逻辑中,动态给数据集添加Day 1到Day 31的字段:
use Yajra\DataTables\Facades\DataTables; use Illuminate\Http\Request; public function loadDatatableData(Request $request) { $employees = \App\Models\Employee::query(); return DataTables::of($employees) ->addColumn('name', fn($employee) => $employee->name) ->addColumn('employee_id', fn($employee) => $employee->employee_id) // 循环生成每日数据字段 ->addColumns(function($employee) { $dayFields = []; for ($i = 1; $i <= 31; $i++) { // 这里替换为你的业务逻辑,比如获取当日考勤状态 $status = \App\Models\Attendance::where('employee_id', $employee->id) ->whereDay('record_date', $i) ->value('status') ?? '无记录'; $dayFields["day_{$i}"] = $status; } return $dayFields; }) ->rawColumns(array_merge(['name', 'employee_id'], array_map(fn($i) => "day_{$i}", range(1, 31)))) ->make(true); }
2. Ajax传递数组格式的tgl参数完全可行
- 前端:直接在
ajax.data中传入数组即可,示例中d.tgl = ['2024-05-01', ...],POST/GET请求都支持。 - 后端:Laravel可直接通过
$request->input('tgl')获取数组,后续可直接用于查询或逻辑处理:
$dateList = $request->input('tgl'); // 示例:用数组作为查询条件 $records = \App\Models\Attendance::whereIn('record_date', $dateList)->get();
如果是GET请求,Datatables会自动将数组格式化为tgl[]=2024-05-01&tgl[]=2024-05-02的形式,Laravel依然能正确解析为数组,无需额外处理。
内容的提问来源于stack exchange,提问作者Retaker
相关产品推荐
相关产品推荐

