Laravel Backpack:如何检查记录软删除并隐藏编辑按钮?
在Laravel Backpack 5.x(Laravel 8.x)中隐藏软删除记录的编辑按钮
你的代码存在两处问题:
- 判断软删除的语法错误,Laravel中需调用模型的
trashed()方法,而非{is_trashed}这种写法; - 列表页面向多条记录,
$this->crud->getCurrentEntry()通常用于单条记录页面(如详情、编辑页),无法直接在列表中批量判断每条记录的状态。
以下是两种可行的实现方式:
方式一:修改编辑操作的可见性
在CrudController的setupListOperation()方法中,为编辑操作添加可见性判断,仅未软删除的记录显示编辑按钮:
$this->crud->operation('list', function() { // 修改已有的编辑操作 $this->crud->modifyOperation('edit', function($operation) { $operation->visible(function($entry) { // 未软删除时显示编辑按钮 return !$entry->trashed(); }); }); });
如果是自定义新增编辑操作,可直接写入判断逻辑:
$this->crud->addOperation([ 'name' => 'edit', 'label' => '编辑', 'type' => 'button', 'url' => fn($entry) => backpack_url('your-model/' . $entry->id . '/edit'), 'visible' => fn($entry) => !$entry->trashed() ]);
方式二:配合软删除过滤器(可选)
若模型已引入SoftDeletes trait,Backpack默认会在列表页显示「已删除」过滤器。可设置默认展示未删除记录,再结合上述操作可见性判断:
// 在setupListOperation中配置软删除过滤器 $this->crud->addFilter([ 'type' => 'trashed', 'name' => 'trashed', 'label' => '状态' ], null, function($value) { if ($value == 'trashed') { $this->crud->query = $this->crud->query->onlyTrashed(); } elseif ($value == 'all') { $this->crud->query = $this->crud->query->withTrashed(); } // 默认显示未删除记录 });
注意事项
- 确保模型已引入
Illuminate\Database\Eloquent\SoftDeletestrait; - 数据库表需包含
deleted_at字段(迁移时使用$table->softDeletes()); - 测试时可分别创建正常记录和软删除记录,验证编辑按钮的显示逻辑。
内容的提问来源于stack exchange,提问作者Liju
相关产品推荐
相关产品推荐

