我想跟踪(记录)对每个数据库行所做的更改。这意味着,保存对每个表的每个记录所做的每个操作(插入,更新,删除)的日志。
此问题已针对模型解决,因为它们使用model events从BaseModel
和我{i}扩展。但是,我似乎无法找到一种方法来记录透视表中的更改。
鉴于以下表users
,profiles
和profile_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);
});
}
}
这允许我记录user
和profile
的更改,但不记录profile_user
的更改。
我尝试创建一个ProfileUser
模型,该模型从Pivot
(Illuminate\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"]));
我正在寻找一种不涉及触发自定义事件的解决方案(因为这意味着我必须为数据库中的每个数据透视表执行此操作)。
如何在数据透视表中使用模型事件?
答案 0 :(得分:3)
我知道您不想要自定义事件情况,但我找不到任何非自定义解决方案。
然而,你可以做一个非常简单的自定义(从Laravel文档中拉出来):
DB::listen(function($sql, $bindings, $time)
{
//regex matching for tables in SQL query
//as well as firing your event handling code
});