🔍
https://yunshuai.me

Laravel 是如何执行软删除的?

  1. 在 model 类文件中中引入 Illuminate\Database\Eloquent\SoftDeletes trait,该 trait 会覆盖 Illuminate\Database\Eloquent\Model 基类中的 performDeleteOnModel()

  2. 在 model 实例上调用 delete(),该方法除了做一些其他的事,还会调用 performDeleteOnModel(),而 Illuminate\Database\Eloquent\SoftDeletes trait 中的 performDeleteOnModel() 方法会检查是否需要强制删除,如果不是,则会调用 runSoftDelete() 执行软删除。

  3. 可以看到,实际上是做了一次更新操作,主要更新的是 getDeletedAtColumn() 返回的字段,默认为 deleted_at

    protected function runSoftDelete()
    {
    $query = $this->setKeysForSaveQuery($this->newModelQuery());
     
    $time = $this->freshTimestamp();
     
    $columns = [$this->getDeletedAtColumn() => $this->fromDateTime($time)];
     
    $this->{$this->getDeletedAtColumn()} = $time;
     
    if ($this->timestamps && ! is_null($this->getUpdatedAtColumn())) {
    $this->{$this->getUpdatedAtColumn()} = $time;
     
    $columns[$this->getUpdatedAtColumn()] = $this->fromDateTime($time);
    }
     
    $query->update($columns);
    }