在Laravel 5中,我发现令人费解的是它如何处理删除事件和任何更改的属性。基本上,软删除只是对表上的deleted_at列的更新。我试图变得聪明,并且还包括用户的用户ID进行删除。问题是,当将更改的属性传递给查询生成器时,删除方法会忽略这些属性。
以这个模型为例。
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
use SoftDeletes;
protected $table = 'users';
protected $fillable = [
'user_name', 'created_at', 'created_by', 'updated_at', 'updated_by', 'deleted_at'
];
public static function boot() {
parent::boot();
// This works and updates my updated_by column
User::updating(function($user) {
$user->updated_by = 1;
});
// This is being ignored and does not update the updated_by column
User::deleting(function($user) {
$user->updated_by = 1;
});
}
}我已经跟踪了创建、更新和删除模型方法。在任何情况下,我的事件侦听器都会被捕获和处理。
但是,在方法中,有一个不同之处。这两个方法都调用getDirty()方法,该方法查找更改的属性,并将数组传递给查询生成器。这就是为什么插入或更新事件有效的原因。
但是,delete方法不执行此检查,因此不会将这些属性传递给构建器。尽管如果您在整个操作过程中查看堆栈,$this->model‘’attributes‘已经更改了我的updated_at属性!建筑商从来没有用过它。
因此,我想我的问题是,如果不重写源代码,那么在使用软删除时,您将如何将属性注入delete方法。就像我的模型例子一样。
这里的最终目标是在执行软删除时更新updated_by字段。我试图避免首先对表进行更新,然后执行删除操作。
发布于 2015-04-09 02:52:59
我认为问题在于事件发生后更新事件调用save()函数,因此您所做的任何更改都将包含在save()调用中。
delete事件可能不会调用相同的save()函数,因此您的更改将丢失。
试着强迫自己拯救自己,看看这是否有效?
User::deleting(function($user) {
$user->updated_by = 1;
$user->save();
});发布于 2016-03-09 05:22:29
只需覆盖模型中的方法runSoftDelete
class User extends Model
{
protected function runSoftDelete()
{
$query = $this->newQuery()->where($this->getKeyName(), $this->getKey());
$this->{$this->getDeletedAtColumn()} = $time = $this->freshTimestamp();
$query->update(array($this->getDeletedAtColumn() => $this->fromDateTime($time), 'updated_by' => 1));
}
}https://stackoverflow.com/questions/29527310
复制相似问题