Laravel Обновление Eloquent Field автоматически при сохранении

У меня есть необходимость обновить поле в таблице базы данных до хэша MD5 других значений полей (sting concat)

Я пытаюсь сделать это через красноречивую модель сохранения / обновления / создания событий, но кажется, что вы не можете использовать события для обновления / изменения данных.

В настоящее время у меня есть следующее:

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

Это не имеет желаемого эффекта; Есть ли способ сделать это - я не хочу добавлять ручной вызов этой функции в разных местах, так как я чувствую, что она должна быть автоматической.

заранее спасибо

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));
    });

Вы можете определить сеттер-мутатор в своей модели, чтобы вы могли создать там хэш MD5 и установить его в свойство модели, прежде чем он будет сохранен.

документы: https://laravel.com/docs/5.7/eloquent-mutators

Другие вопросы по тегам