如何捕获数据透视表中的模型事件

时间:2014-11-24 21:53:33

标签: laravel laravel-4 model eloquent

我想跟踪(记录)对每个数据库行所做的更改。这意味着,保存对每个表的每个记录所做的每个操作(插入,更新,删除)的日志。

此问题已针对模型解决,因为它们使用model eventsBaseModel和我{i}扩展。但是,我似乎无法找到一种方法来记录透视表中的更改。

鉴于以下表usersprofilesprofile_user(profile_id, user_id),我有以下代码:

class User extends BaseModel {
    public function profiles() {
        return $this->belongsToMany('Profile');
    }
}

class Profile extends BaseModel {
    public function users() {
        return $this->belongsToMany('User');
    }
}

abstract class BaseModel extends Model {
    public static function boot() {
        parent::boot();

        static::created(function($model) {
            return LogTracker::saveRowCreatedOrUpdated($model, true);
        });

        static::updated(function($model) {
            return LogTracker::saveRowCreatedOrUpdated($model, false);
        });

        static::deleted(function($model) {
            return LogTracker::saveRowDeleted($model);
        });
    }
}

这允许我记录userprofile的更改,但不记录profile_user的更改。

我尝试创建一个ProfileUser模型,该模型从PivotIlluminate\Database\Eloquent\Relations\Pivot)扩展而来,我定义了模型事件,但这些模型无效。

我猜这是因为我从未创建过这个模型的新实例。所以,我已将以下内容添加到我的User模型中(以及与Profile相似的代码):

class User extends BaseModel {
    // (...)
    public function newPivot(Eloquent $parent, array $attributes, $table, $exists) {
        if ($parent instanceof Profile) {
            return new ProfileUser($parent, $attributes, $table, $exists);
        }
        return parent::newPivot($parent, $attributes, $table, $exists);
    }
    // (...)
}

但是,事件永远不会被触发(实际上这个方法永远不会被执行)。

我正在通过sync()更新关系:

$user->profiles()->sync(explode(',', $values["profiles"]));

我正在寻找一种不涉及触发自定义事件的解决方案(因为这意味着我必须为数据库中的每个数据透视表执行此操作)。

如何在数据透视表中使用模型事件?

1 个答案:

答案 0 :(得分:3)

我知道您不想要自定义事件情况,但我找不到任何非自定义解决方案。

然而,你可以做一个非常简单的自定义(从Laravel文档中拉出来):

DB::listen(function($sql, $bindings, $time)
{
    //regex matching for tables in SQL query
    //as well as firing your event handling code
});

http://laravel.com/docs/4.2/database#running-queries