Несоответствие между eloquent `isDirty ()` и `getChanges ()` - PullRequest
0 голосов
/ 09 октября 2019

В настоящее время я работаю над проектом Laravel 5.8 и при обновлении модели заметил, что, несмотря на отсутствие каких-либо изменений в модели, я сохраняю эту модель обратно в базу данных.

Я хотел избежать этого следующим образом:

$model = Model::find($id);
$model->fill([
    "name" => $request->name,
    ...
]);
if($model->isDirty){
    $model->save()
}

Проблема в том, что, хотя я не изменяю значения в своей модели, я все еще вхожу в условие if() и сохраняюмодель. Я попытался использовать временную переменную и отладил $model->getChanges(), и я получил пустой массив.

Это ожидаемое поведение?

1 Ответ

1 голос
/ 15 октября 2019

Есть разница да.

Код, связанный с этим: https://github.com/laravel/framework/blob/6.x/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php#L1060

isDirty код

/**
 * Determine if the model or any of the given attribute(s) have been modified.
 *
 * @param  array|string|null  $attributes
 * @return bool
 */
public function isDirty($attributes = null)
{
    return $this->hasChanges(
        $this->getDirty(), is_array($attributes) ? $attributes : func_get_args()
    );
}

getChanges () & getDirty code

/**
 * Get the attributes that have been changed since last sync.
 *
 * @return array
 */
public function getDirty()
{
    $dirty = [];
    foreach ($this->getAttributes() as $key => $value) {
        if (! $this->originalIsEquivalent($key, $value)) {
            $dirty[$key] = $value;
        }
    }
    return $dirty;
}
/**
 * Get the attributes that were changed.
 *
 * @return array
 */
public function getChanges()
{
    return $this->changes;
}

Подводя итог.

Ответ, использованный в этом сообщении: https://laracasts.com/discuss/channels/eloquent/observer-column-update-isdirty-or-waschanged

isDirty (и getDirty) используется ПЕРЕД сохранением, чтобы увидеть, какие атрибуты были изменены между временем, когда он был получен из базы данных. и время вызова, когда wasChanged (и getChanges) используется ПОСЛЕ сохранения, чтобы увидеть, что атрибуты были изменены / обновлены при последнем сохранении (из кода в базу данных).

Причина, по которой выполучить в проверке isDirty является то, что перед проверкой вы делаете fill (). Я думаю, что это будет автоматическое заполнение updated_at. Так что, по сути, модель, в данном случае, была изменена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...