Laravel 5 Laravel 5模型在软删除时删除事件忽略属性
在Laravel 5中,我发现令人费解的是它如何处理删除事件和任何更改的属性。基本上,软删除只是表上已删除的_at列的更新。我试图聪明一点,还包括进行删除的用户的用户ID。问题是删除方法在将更改的属性传递给查询生成器时会忽略这些属性 以这个模型为例Laravel 5 Laravel 5模型在软删除时删除事件忽略属性,laravel-5,Laravel 5,在Laravel 5中,我发现令人费解的是它如何处理删除事件和任何更改的属性。基本上,软删除只是表上已删除的_at列的更新。我试图聪明一点,还包括进行删除的用户的用户ID。问题是删除方法在将更改的属性传递给查询生成器时会忽略这些属性 以这个模型为例 <?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { use SoftDeletes; prote
<?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;
});
}
}
我认为问题在于更新事件在事件发生后调用了save()
函数,因此您所做的任何更改都将包含在save()
调用中
delete事件可能不会调用相同的save()
函数,因此您的更改将丢失
试着强迫你自己拯救自己,看看这是否有效
User::deleting(function($user) {
$user->updated_by = 1;
$user->save();
});
只需在模型中重写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));
}
}
那么,您是说在使用软删除时不会触发“删除”事件吗?这听起来像是一个可能的错误…不,它正在开火。我跟踪了每一个操作,它选择了我的“删除”模型事件监听器。问题是delete方法忽略了我在事件侦听器中设置的updated_by属性。是的,这就是我目前正在做的事情……先更新,然后删除。我试图不让删除有2个事务。我修改了源代码,并将提交一个pull请求。谢谢