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

Laravel Datatable如何通过请求传双参数并实现条件按钮控制

Laravel Datatable 变量传递与列显示问题解决

问题描述

需要在Datatable的addColumn闭包内同时使用$row、$attendanceDate和请求参数$request->day_wise做有效性校验,实现两个需求:

  1. 根据权限和业务条件生成操作按钮并在视图中显示;
  2. 当请求中不存在day_wise参数时,隐藏action列。

当前代码存在两个核心问题:

  • 闭包内使用$request时报错,因为未将其传递到闭包作用域;
  • 外部变量$attendanceDate的访问逻辑存在漏洞。

原代码示例

return datatables()
            ->of($employee)
            ->addIndexColumn()
            ->addColumn('action', function($row) use ($attendanceDate) 
            {
                $btnId = $row->company_id."_".$row->branch_id."_".$row->id."_".$attendanceDate."_".$row->department_id."_".$row->designation_id;
                $btn='';
                $status = Attendance::where([['employee_id', '=', $row->id],['current_date', '=', $attendanceDate]])->first();
                if ((Auth::user()->hasPermissionTo('attendance-create') || Auth::user()->hasPermissionTo('attendance-update')) &&  !isset($request->day_wise) )
                {
                    if($current_day>=3 && $given_month==$current_munth && $left_days<8)
                    {
                        if(isset($status->status) && $status->status!=2 && $status->working_time <'08:00:00'){
                            $btn .= '&lt;a href=&quot;javascript:void(0)&quot; class=&quot;btn btn-info btn-outline btn-circle btn-lg attendance_employee&quot; employee_name=&quot;'.$row->name.'&quot; table_id=&quot;'.$btnId.'&quot; data-toggle=&quot;tooltip&quot; title=&quot;Attendance&quot;&gt;&lt;i class=&quot;fas fa-clock&quot;&gt;&lt;/i&gt;&lt;/a&gt;';
                        }
                    }
                }
                return $btn;
            })
            ->make(true);

解决方案

1. 传递外部变量到闭包

闭包要访问外部的$request、$attendanceDate以及业务变量($current_day、$given_month等),必须通过use关键字声明传递,解决变量作用域问题。

2. 条件控制action列的显示

使用Datatable的when()方法,仅当请求中不存在day_wise参数时才添加action列,直接从后端层面实现列隐藏逻辑。

3. 修正HTML渲染与参数判断

  • 用Laravel推荐的$request->has('day_wise')替代isset($request->day_wise)判断参数是否存在;
  • 添加rawColumns(['action'])确保HTML按钮被正确渲染,而非转义显示。

修改后的完整代码

return datatables()
    ->of($employee)
    ->addIndexColumn()
    // 条件添加action列:仅当day_wise参数不存在时添加
    ->when(!$request->has('day_wise'), function ($datatable) use ($attendanceDate, $request, $current_day, $given_month, $current_munth, $left_days) {
        return $datatable->addColumn('action', function ($row) use ($attendanceDate, $request, $current_day, $given_month, $current_munth, $left_days) {
            $btnId = $row->company_id . "_" . $row->branch_id . "_" . $row->id . "_" . $attendanceDate . "_" . $row->department_id . "_" . $row->designation_id;
            $btn = '';
            
            $status = Attendance::where([
                ['employee_id', '=', $row->id],
                ['current_date', '=', $attendanceDate]
            ])->first();
            
            // 权限与业务条件判断
            if ((Auth::user()->hasPermissionTo('attendance-create') || Auth::user()->hasPermissionTo('attendance-update')) && !$request->has('day_wise')) {
                if ($current_day >= 3 && $given_month == $current_munth && $left_days < 8) {
                    if (isset($status->status) && $status->status != 2 && $status->working_time < '08:00:00') {
                        $btn .= '<a href="javascript:void(0)" class="btn btn-info btn-outline btn-circle btn-lg attendance_employee" employee_name="' . $row->name . '" table_id="' . $btnId . '" data-toggle="tooltip" title="Attendance"><i class="fas fa-clock"></i></a>';
                    }
                }
            }
            
            return $btn;
        });
    })
    ->rawColumns(['action']) // 允许渲染HTML内容
    ->make(true);

关键说明

  • ->when()方法:根据请求参数动态决定是否添加action列,避免不必要的列渲染;
  • use关键字:确保闭包能访问外部的所有必要变量,解决变量作用域问题;
  • rawColumns():告诉Datatable不对action列的内容进行HTML转义,保证按钮正常显示。

内容的提问来源于stack exchange,提问作者heena kaushar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:45:19