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

如何正确处理所有Model的eloquent.deleted事件?

问题描述

我想在任意Model被删除后执行操作,目前的实现存在问题。删除前已获取Model,理论上应触发eloquent.deleted事件,我希望直接在AppServiceProvider中做通用处理,但监听器未生效,Laravel日志也无报错,怀疑监听方式有误。

原实现代码

AppServiceProvider.php

<?php

namespace App\Providers;

use App\Models\DebugLog;
use App\Models\Jobs\JobLog;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Event;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Event::listen('eloquent.deleted: *', function(string $eventName, array $data){
            DebugLog::create([
                'function' => 'AppServiceProvider: Event eloquent.deleted',
                'object' => json_encode($data,JSON_PRETTY_PRINT),
                'message' => $eventName
            ]);
            //JobLog::where('tablename',$c_table)->where('entryid',$c_id)->delete();
        });
    }
}

Model删除代码

$deletionSucc = InboundPlan::where('inboundplanid',$container->inboundplanid)->where('account',$container->__get('account'))->first()->delete();
我的解决方案

最终改用Trait处理,因为并非所有Model都需要触发该逻辑,且无需为每个相关Model单独添加代码。

JobLogDeletionTrait.php

<?php

namespace App\Traits;

use App\Models\DebugLog;
use App\Models\Jobs\JobLog;

trait JobLogDeletionTrait
{
    public static function bootJobLogDeletionTrait()     
    {         
        static::deleting(function ($model) {
            $modelArr = $model->toArray();
            $succ = JobLog::where('tablename',$model->getTable())->where('entryid',$modelArr[$model->getKeyName()])->delete();
        });          
        
        static::deleted(function ($model) {        
            $modelArr = $model->toArray();     
            $succ = JobLog::where('tablename',$model->getTable())->where('entryid',$modelArr[$model->getKeyName()])->delete();
        });     
    } 
}

只需在需要触发逻辑的Model中引入该Trait即可,这种方式比监听所有Model删除事件更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:19:53