Laravel Nova 删除对应数据库条目时如何同步删除磁盘上的图片?
结论
Laravel Nova 本身没有内置自动清理磁盘未使用图片的功能,你需要自行实现文件同步删除逻辑,以下是两种成熟的实现方案:
方案1:使用 Nova File 字段自带的prunable()方法(最适配Nova场景)
这是最简单的实现方式,只需要给你的File字段链式调用prunable()方法即可,修改后的字段代码如下:
public function fields(Request $request) { return [ ID::make(__('ID'), 'id')->sortable(), Text::make('Heading'), Text::make('Content'), File::make('Image')->disk('public')->prunable(), ]; }
配置后Nova会自动在两个场景触发旧文件删除:
- 对应资源条目被删除时,同步删除关联的图片文件
- 资源更新时上传了新的图片替换旧图片,自动删除旧的图片文件
方案2:通过 Laravel 模型事件实现(全场景通用)
如果你除了Nova操作之外,还有其他代码层面直接删除模型的场景,建议用Laravel模型的删除事件来实现,逻辑更通用。
只需要在对应资源绑定的Eloquent模型中添加删除事件监听即可,示例代码如下:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Storage; class YourModel extends Model { protected static function booted() { // 监听模型删除事件 static::deleting(function ($model) { // 删除关联的图片文件 if ($model->image) { Storage::disk('public')->delete($model->image); } }); } }
注意事项
- 如果你的模型开启了软删除,建议将上述事件改为监听
forceDeleted事件,避免软删除数据时提前删除文件,导致数据恢复时图片丢失 - 批量删除数据库条目时(比如
YourModel::where(...)->delete())不会触发模型的删除事件,这种场景需要你单独遍历删除对应的文件,或者避免直接使用批量删除操作
内容的提问来源于stack exchange,提问作者Artur Müller Romanov
相关产品推荐
相关产品推荐

