【问题标题】:Laravel Update Eloquent Field automatically on saveLaravel 在保存时自动更新 Eloquent 字段
【发布时间】:2019-05-30 23:34:13
【问题描述】:

我需要将数据库表中的字段更新为其他字段值的 MD5 哈希(字符串连接)

我正在尝试通过 eloquent 模型保存/更新/创建事件来执行此操作,但您似乎无法使用这些事件来更新/更改数据。

目前我有以下:

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

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

提前致谢

【问题讨论】:

    标签: laravel eloquent laravel-events


    【解决方案1】:

    你可以在你的模型中定义一个setter mutator,这样你就可以在它被保存之前创建MD5哈希并将它设置为模型属性。

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

    【讨论】:

    • 这不起作用,因为它期望首先传递一个值然后改变该值,所以如果你不调用 $model->sku = '' 则不会调用 mutator。
    • 你说:'其他字段值'所以,当所有模型都设置了它的属性时,你可以有一个最后一个属性,你可以在其中设置一些东西,它连接了该模型实例属性的其余部分: )
    【解决方案2】:

    所以我想我在这里找到了答案。它是两个折叠:

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

    所有的事件代码现在看起来像这样:

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

    【讨论】:

    • 谢谢。这是荒谬的直觉。很高兴找到你的答案。
    猜你喜欢
    • 2019-09-15
    • 1970-01-01
    • 2017-09-19
    • 2013-12-09
    • 1970-01-01
    • 2018-01-23
    • 2017-09-23
    • 2014-11-14
    • 2019-09-27
    相关资源
    最近更新 更多