Laravel 保存时自动更新 Eloquent 字段

Laravel Update Eloquent Field automatically on save

我需要将数据库中的一个字段 table 更新为其他字段值的 MD5 散列值(sting concat)

我正在尝试通过 eloquent 模型 saving/updating/creating 事件来执行此操作,但您似乎无法将这些事件用于 update/alter 数据。

目前我有以下内容:

static::saving(function ($model) {
        CustomLog::debug(__CLASS__, __FUNCTION__, __LINE__, 'saving fired');
        $model->sku = static::generateSku($model);
    });

这没有达到预期的效果;有没有办法做到这一点 - 我不想在不同的地方手动调用这个函数,因为我觉得它应该是自动的。

提前致谢

您可以在您的模型中定义一个 setter 突变器,这样您就可以在其中创建 MD5 哈希并将其设置为模型 属性,然后再保存。

文档:https://laravel.com/docs/5.7/eloquent-mutators

所以我想我在这里找到了答案。它有两层:

  1. 在事件回调中,您需要使用 $model->setAttribute($field, $value); 更新相关字段功能。
  2. 在我的 generateSku 函数中,我依靠模型关系从子关系中获取名称等;然而,此时模型关系还没有更新,因此该功能正在使用旧关系。将此更改为使用正在更新的 model/table 中的数据而不是其关系具有预期的效果。

总而言之,事件代码现在如下所示:

static::saving(function ($model) {
        CustomLog::debug(__CLASS__, __FUNCTION__, __LINE__, 'saving model fired');
        $model->setAttribute('sku', static::generateSku($model));
    });