Laravel-Admin 回收站功能需三步实现:模型启用软删除、列表添加“回收站”筛选、注册“恢复”操作按钮;依赖 Laravel 软删机制,非独立插件,须注意关联数据、唯一约束及权限控制。

在 Laravel-Admin 后台中启用“回收站”功能,本质是让软删除数据可查、可选、可恢复。它不是开箱即用的独立模块,而是基于 Laravel 原生软删除机制 + Laravel-Admin 的筛选与操作扩展实现的。关键不在于装插件,而在于三步对齐:模型配软删、列表加筛选、操作补恢复逻辑。
一、确保模型已正确启用软删除
这是所有后续操作的前提,缺一则回收站形同虚设。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 数据库迁移中必须包含
$table->softDeletes(),执行php artisan migrate确认deleted_at字段存在且为 NULLABLE TIMESTAMP - 模型(如
app/Models/Menu.php)需引入 trait 并声明:
use Illuminate\Database\Eloquent\SoftDeletes;
class Menu extends Model { use SoftDeletes; } - 无需手动加
$dates = ['deleted_at'](Laravel 6+ 自动识别),但加了也无害
二、在 Laravel-Admin 菜单列表中显示“回收站”筛选开关
默认列表只显示未删除数据。要让用户看到已删菜单并勾选恢复,需显式开启软删数据可见性。
- 在对应 Admin 控制器(如
app/Admin/Controllers/MenuController.php)的grid()方法中,添加筛选器:
protected function grid()
{
$grid = new Grid(new Menu);
// 允许用户勾选“显示已删除项”
$grid->filter(function ($filter) {
$filter->scope('trashed', '回收站')->onlyTrashed();
});
return $grid;
}
- 保存后,菜单列表页右上角会出现「回收站」筛选按钮,点击即可只显示
deleted_at IS NOT NULL的菜单项
三、添加“批量恢复”操作按钮
仅能查看不够,得支持一键还原。Laravel-Admin 不自带 restore 按钮,需手动注册动作。
- 在同个
MenuController.php中,追加以下方法:
protected function actions(Grid $grid)
{
$grid->actions(function (Grid\Displayers\Actions $actions) {
// 在每行右侧加「恢复」按钮(仅对软删项显示)
if ($actions->row->trashed()) {
$actions->append('恢复');
}
});
}
// 注册路由和处理方法
public function restore($id)
{
$menu = Menu::withTrashed()->findOrFail($id);
$menu->restore();
admin_toastr('菜单已恢复');
return redirect()->back();
}
- 同时在
routes/admin.php中注册路由:
Route::get('menus/{id}/restore', [MenuController::class, 'restore'])->name('admin.menus.restore'); - 如需支持批量恢复(勾选多行 → 点“恢复”),可在
grid()中添加工具栏按钮,并调用类似逻辑:
$grid->tools(function (Grid\Tools $tools) {<br> $tools->append('<a class="btn btn-sm btn-default" href="'.route('admin.menus.batch-restore').'">批量恢复</a>');<br> });
再配合一个batchRestore()方法,用Menu::onlyTrashed()->whereIn('id', $ids)->restore()
四、注意事项与避坑点
- 菜单关联项不会自动恢复:比如菜单下有子项(parent_id 关联),恢复父菜单时,子项仍处于软删状态,需额外处理或提示
-
唯一约束可能冲突:若菜单名设了唯一索引,恢复时可能因已有同名未删菜单报错,建议在
restore()前加校验或改用restoreOrFail() -
forceDelete() 数据不可逆:一旦执行过物理删除,回收站里永远看不到它——确认业务中禁用或严格管控
forceDelete -
权限控制别遗漏:恢复操作应限制给管理员,可在
MenuPolicy中定义restore()权限并绑定到控制器

















