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

如何在Yajra Laravel Datatables中按条件控制操作按钮显示

在Laravel 10 + Yajra Datatable中根据业务逻辑显示/隐藏操作按钮

针对你的需求,有两种简洁的实现方式,可根据业务复杂度选择:

方法一:直接在Blade视图中添加业务判断

在resources/views/partials/datatablesActions.blade.php的Edit按钮代码块中,在权限判断的基础上增加业务状态校验。假设你的请假模型有status字段,值为approved代表已审批,修改代码如下:

@can($viewGate)
    <a class="btn btn-xs btn-primary" href="{{ route('admin.' . $crudRoutePart . '.show', $row->id) }}">
        {{ trans('global.view') }}
    </a>
@endcan
@can($editGate)
    {{-- 新增业务判断:仅当请假未审批时显示编辑按钮 --}}
    @if($row->status !== 'approved')
        <a class="btn btn-xs btn-info" href="{{ route('admin.' . $crudRoutePart . '.edit', $row->id) }}">
            {{ trans('global.edit') }}
        </a>
    @endif
@endcan
@can($deleteGate)
    <form action="{{ route('admin.' . $crudRoutePart . '.destroy', $row->id) }}" method="POST" onsubmit="return confirm('{{ trans('global.areYouSure') }}');" style="display: inline-block;">
        <input type="hidden" name="_method" value="DELETE">
        <input type="hidden" name="_token" value="{{ csrf_token() }}">
        <input type="submit" class="btn btn-xs btn-danger" value="{{ trans('global.delete') }}">
    </form>
@endcan

这种方式直接在视图层完成判断,适合逻辑简单的场景,同时保留了原有的权限控制(@can指令)。

方法二:在控制器中处理逻辑后传递变量到视图

如果业务逻辑较复杂,可将判断逻辑移至控制器,传递处理后的变量到视图,让视图更简洁:

  1. 修改控制器中的Datatable列定义:
$table->editColumn('actions', function ($row) {
    $viewGate = 'leave_show';
    $editGate = 'leave_edit';
    $deleteGate = 'leave_delete';
    $crudRoutePart = 'leaves';

    // 合并权限与业务逻辑,判断是否允许编辑
    $canEdit = auth()->user()->can($editGate) && $row->status !== 'approved';

    return view('partials.datatablesActions', compact(
        'viewGate',
        'editGate',
        'deleteGate',
        'crudRoutePart',
        'row',
        'canEdit' // 传递处理后的变量
    ));
});
  1. 修改Blade视图中的Edit按钮部分:
@can($viewGate)
    <a class="btn btn-xs btn-primary" href="{{ route('admin.' . $crudRoutePart . '.show', $row->id) }}">
        {{ trans('global.view') }}
    </a>
@endcan
{{-- 直接使用控制器传递的变量判断 --}}
@if($canEdit)
    <a class="btn btn-xs btn-info" href="{{ route('admin.' . $crudRoutePart . '.edit', $row->id) }}">
        {{ trans('global.edit') }}
    </a>
@endif
@can($deleteGate)
    <form action="{{ route('admin.' . $crudRoutePart . '.destroy', $row->id) }}" method="POST" onsubmit="return confirm('{{ trans('global.areYouSure') }}');" style="display: inline-block;">
        <input type="hidden" name="_method" value="DELETE">
        <input type="hidden" name="_token" value="{{ csrf_token() }}">
        <input type="submit" class="btn btn-xs btn-danger" value="{{ trans('global.delete') }}">
    </form>
@endcan

两种方式都能实现需求,方法一更适合简单逻辑,方法二更适合复杂场景的逻辑复用。

内容的提问来源于stack exchange,提问作者Siddiqui Noor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:05:17