laravel取消激活模型上的update()事件

时间:2017-03-19 19:47:07

标签: php laravel events laravel-5 eloquent

当我的模型更新时,会触发一个事件:

protected $events = [
    'updated' => ZoneUpdated::class,
];

触发的事件监听器也将在模型上创建:

public function handle(ZoneUpdated $event)
{
    Zone::find($event->zone->id)->update([
        'updated' => true,
        'valid'   => 'u',
    ]);
}

如何禁用侦听器来触发新事件,因为此时会产生无限循环。

2 个答案:

答案 0 :(得分:2)

如果您仍需要跟踪模型更新事件并仍然继续更新该模型,您可以尝试使用Fluent在Listener中更新模型

public function handle(ZoneUpdated $event)
{
    // assuming table name for Zone Model is "zones" and primary key is "id"
    \DB::table('zones')
        ->where('id', $event->zone->id)
        ->update([
            'updated' => true,
            'valid'   => 'u',
        ]);
}

使用fluent应该停止无限循环,因为它不再基于模型对象执行更新,而是通过Fluent直接执行数据库。

话虽如此,我建议你重新考虑如何使用事件监听器,如果这真的是你需要的话。

答案 1 :(得分:0)

有一些方法可以确保事件仅在某些情况下触发,但我发现绕过这种情况的一种更简单的方法是使用updating事件代替update

protected $events = [
    'updating' => ZoneUpdated::class,
];