Laravel 是如何执行软删除的?
在 model 类文件中中引入
Illuminate\Database\Eloquent\SoftDeletes
trait,该 trait 会覆盖Illuminate\Database\Eloquent\Model
基类中的performDeleteOnModel()
。在 model 实例上调用
delete()
,该方法除了做一些其他的事,还会调用performDeleteOnModel()
,而Illuminate\Database\Eloquent\SoftDeletes
trait 中的performDeleteOnModel()
方法会检查是否需要强制删除,如果不是,则会调用runSoftDelete()
执行软删除。可以看到,实际上是做了一次更新操作,主要更新的是
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);}