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

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

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

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

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

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

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


person Scott-David Jones    schedule 04.01.2019    source источник


Ответы (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));
    });
person Scott-David Jones    schedule 04.01.2019
comment
БЛАГОДАРЮ ВАС. Это было до смешного интуитивно понятно. Я рад, что нашел ваш ответ. - person Fiote; 24.01.2020

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

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

person nyu.exe    schedule 04.01.2019
comment
это не работает, поскольку предполагается, что сначала будет передано значение, а затем изменено это значение, поэтому, если вы не вызовете $model-›sku = '', мутатор не будет вызван. - person Scott-David Jones; 04.01.2019
comment
Вы сказали: «другие значения поля», поэтому, когда вся модель установлена ​​с ее свойствами, у вас может быть последнее свойство, где вы что-то устанавливаете, которое объединяет остальные свойства экземпляра этой модели :) - person nyu.exe; 04.01.2019