首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5模型删除软删除时忽略属性的事件

Laravel 5模型删除软删除时忽略属性的事件
EN

Stack Overflow用户
提问于 2015-04-08 23:51:30
回答 2查看 2.4K关注 0票数 0

在Laravel 5中,我发现令人费解的是它如何处理删除事件和任何更改的属性。基本上,软删除只是对表上的deleted_at列的更新。我试图变得聪明,并且还包括用户的用户ID进行删除。问题是,当将更改的属性传递给查询生成器时,删除方法会忽略这些属性。

以这个模型为例。

代码语言:javascript
复制
<?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字段。我试图避免首先对表进行更新,然后执行删除操作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-09 02:52:59

我认为问题在于事件发生后更新事件调用save()函数,因此您所做的任何更改都将包含在save()调用中。

delete事件可能不会调用相同的save()函数,因此您的更改将丢失。

试着强迫自己拯救自己,看看这是否有效?

代码语言:javascript
复制
    User::deleting(function($user)  {
        $user->updated_by = 1;
        $user->save();
    });
票数 1
EN

Stack Overflow用户

发布于 2016-03-09 05:22:29

只需覆盖模型中的方法runSoftDelete

代码语言:javascript
复制
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));
     }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29527310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档