如何在模型事件中检测强制删除

geo*_*310 4 php laravel laravel-5

我已经设置了一个模型事件来检查图像何时被删除并删除相关的image_size模型条目.但是图像使用软删除,所以如果它被软删除,那么我想软删除image_size记录,但如果使用forceDelete硬删除图像,那么我想硬删除image_size记录.有没有办法检测它是什么类型的删除并采取相应的行动.这是我目前在我的Image模型中所拥有的:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Image extends Model
{
    use SoftDeletes;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['url', 'thumb_url', 'filename'];

    /**
     * Relationship to image sizes
     */
    public function sizes()
    {
        return $this->hasMany('App\Image_size');
    }

    /**
    * Model events
    */
    protected static function boot() {
        parent::boot();

        static::deleting(function($image) { // before delete() method call this
             $image->sizes()->delete();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Bjö*_*örn 6

如果我没记错的话,你在$image对象上有一个属性叫做forceDeleting.

static::deleting(function($image) { 
    if($image->forceDeleting){
        //do in case of force delete
    } else {
        //do in case of soft delete
    }
});
Run Code Online (Sandbox Code Playgroud)

但是我认为上次我这样做是在几个版本中,所以不确定它是否仍然有效.

  • 看起来现在是`$ image-> isForceDeleting()` (9认同)

pab*_*rsk 5

现在forceDeleting受到保护(您无法访问值)。你需要使用
$image->isForceDeleting()

当您使用观察者时(推荐在 Laravel >5.5 上使用)。

class Image extends Model
{
    use SoftDeletes;

    /* ... */

    protected static function boot(): void
    {
        parent::boot();
        parent::observe(ImageObserver::class);
    }
}

class ImageObserver
{
    public function deleting($image): void
    {
        if ($image->isForceDeleting()) {
            // do something
        }
    }
}
Run Code Online (Sandbox Code Playgroud)