Как обновить строку, если хотя бы одно поле изменилось, и вернуть все изменения в laravel 5.7? - PullRequest
0 голосов
/ 15 марта 2019

Я слежу за этим постом , чтобы обновить строку, если какое-либо поле изменилось.

//Retrieve an array from an API
$fields = ['field1'=>var1, 'field2'=>var2, ...];

$row = MyModel::ofField1($this->field1)->ofField2($fields['field2'])->first(); //Selects the row under field1 AND field2 condition. It is working.
$row->updateOrCreate($fields);//Should assign the new values to the model (but not persist)

//Next line should compare the model with what we have in the
//database. At least 1 value from the incomming array is different from what 
//we have in the database - so Update the row with the new value.
if($row->isDirty()){
   $row->save();
}

Это не работает, что мне не хватает?

1 Ответ

0 голосов
/ 15 марта 2019

->updateOrCreate() сохранит данные (которые вы упомянули, что вы не хотите делать).

Этот метод имеет два аргумента:

  • Один для запроса строк с определеннымзначения полей
  • Другое для данных, которые будут использоваться для обновления / создания записи

В этом случае, если вы просто проверяете, обновлено ли одно из двух полей, вам следуетпроверьте, было ли обновлено определенное поле, используя ->isDirty($field):

$row = MyModel::first();

if ($row->isDirty('field1')) {
    $row->field1 = $fields['field1'];
}

if ($row->isDirty('field2')) {
    $row->field2 = $fields['field2'];
}

$row->save();

Поскольку у вас может быть много полей, возвращаемых из API, вы можете выполнить цикл и проверить:

$row = MyModel::first();

foreach ($fields as $field => $value) {
    if ($row->isDirty($field)) {
        $row->$field = $value;
    }
}

$row->save();
...