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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:36:04