Laravel Обновление Eloquent Field автоматически при сохранении
У меня есть необходимость обновить поле в таблице базы данных до хэша MD5 других значений полей (sting concat)
Я пытаюсь сделать это через красноречивую модель сохранения / обновления / создания событий, но кажется, что вы не можете использовать события для обновления / изменения данных.
В настоящее время у меня есть следующее:
static::saving(function ($model) {
CustomLog::debug(__CLASS__, __FUNCTION__, __LINE__, 'saving fired');
$model->sku = static::generateSku($model);
});
Это не имеет желаемого эффекта; Есть ли способ сделать это - я не хочу добавлять ручной вызов этой функции в разных местах, так как я чувствую, что она должна быть автоматической.
заранее спасибо
2 ответа
Так что я думаю, что у меня есть ответ здесь. это две складки:
- в обратном вызове события необходимо обновить соответствующее поле, используя $model->setAttribute($field, $value); функция.
- в моей функции generateSku я полагался на отношения моделей, чтобы получить имена и т. д. из дочерних отношений; однако даже отношения моделей в это время не обновлялись, поэтому функция использовала старые отношения. Изменение этого значения для использования данных из обновляемой модели / таблицы, а не ее взаимосвязей, дало желаемый эффект.
В целом код события теперь выглядит так:
static::saving(function ($model) {
CustomLog::debug(__CLASS__, __FUNCTION__, __LINE__, 'saving model fired');
$model->setAttribute('sku', static::generateSku($model));
});
Вы можете определить сеттер-мутатор в своей модели, чтобы вы могли создать там хэш MD5 и установить его в свойство модели, прежде чем он будет сохранен.