【发布时间】:2022-07-29 22:45:53
【问题描述】:
我正在构建一个 package 来记录 eloquent 上发生的更改,并且我正在尝试找出在 restored 时忽略 updated 事件的检查内容。
trait HasLogs
{
public static function bootHasLogs(): void
{
// created ...
self::updated(callback: fn ($model) => self::log($model, 'updated'));
self::deleted(callback: function ($model) {
// Ignore 'deleted' event when 'softDeleted' or 'forceDeleted'
if (in_array('Illuminate\Database\Eloquent\SoftDeletes', (class_uses(self::class)))) {
return;
}
self::log($model, 'deleted');
});
if (in_array('Illuminate\Database\Eloquent\SoftDeletes', (class_uses(self::class)))) {
// softDeleted ...
self::restored(callback: fn ($model) => self::log($model, 'restored'));
// forceDeleted ...
}
}
// ...
}
如果有帮助,这里是操作顺序:
-
Model::restore()在SoftDeletes特征上。 - ----
restoring被解雇。 - ----
Model::save() - --------
saving被解雇。 - --------
Model::performUpdate() - ------------
updating被解雇。 - ------------
Builder::update() - ------------
updated被解雇。 - --------
Model::finishSave() - ------------
saved被解雇。 - ----
restored被解雇。
【问题讨论】:
-
很确定您可以通过
self::timestamps = false;简单地禁用时间戳,如下所示:stackoverflow.com/questions/18904853/… -
@TimLewis 只会避免在
Model::performUpdate()中调用Model::updateTimestamps() -
还有其他地方
updated_at被更改了吗?我还没有深入研究通过Model::restore()调用的事件链,但我也没有遇到过我关心updated_at是否通过restore更改的情况???? -
@TimLewis
Model::performDeleteOnModel()来自SoftDeletes不会触及timestamps,因为它直接调用Builder::update()。但是Model:restore()通过Model::performUpdate()。 -
我发现只有
performUpdate和performInsert检查usesTimestamps()然后使用updateTimestamps()
标签: laravel events eloquent event-handling laravel-9