Рубрики
Uncategorized

Объект модели фреймворка Laravel для строки JSON Потерял обновление

Автор оригинала: David Wong.

Модель пользователя

class UserModel extends Model {
    public function role()
    {
        return $this->belognsTo(RoleModel::class , 'role_id' , 'id');
    }
}

Процедура ошибки

$user = UserModel::with('role')->find(1);
// user - > role is a RoleModel
// Update role attributes
$user->role = 'test';
// Output test correctly
var_dump($user->role);
// But!! After converting to JSON string
// You will find that role is still a model!!
// It's not the test you set up behind you!
// Freak, lost update? Laravel Bug??
// Actually not! See the subordinate description.
var_dump(json_encode($user));

Ларавель Из Осветить\Базу Данных\Красноречивую\Модель Реализовано JsonSerializable Интерфейс, поэтому он вызывает json_encode При сериализации он называется Model::json Сериализовать Метод, данные, возвращаемые его методом, являются:

array_merge($attribute , $relation);

На самом деле, вы проходите:

$model->name = 'grayVTouch';

Новые атрибуты, добавленные таким образом, Laravel принимают __набор Перегрузка магического метода, добавьте его в атрибут В массиве вы не можете его изменить. отношение Массив!

И пройти Модельная ассоциация Но вы можете отношение Создать единицу массива!

Вы можете видеть, как объединяются вышеуказанные числа. отношение Скроет атрибут В одноименном атрибуте!! Поэтому особое внимание следует уделить следующим вопросам: если ___________ отношение Умеренная сумма атрибут Свойство с тем же именем на китайском языке, пожалуйста, измените его отношение Связанное Имя! Если вы не хотите его менять отношение Имя, настаивайте, чтобы первое покрывало второе, пожалуйста ____________

// save value
$attr = $model->attr;
// Delete attributes: attributes in attribute / relationship (Laravel calls the _unset magic method internally)
unset($model->attr)
// Reset the value to the attributes array only
// Relation will not be set
$model->attr = $model;

Ларавель Потому что атрибуты модели разделены на два массива, и они фактически принадлежат одному и тому же объекту! Так что, если он существует Атрибут с тем же именем Оно неизбежно возникнет. Кто кого прикрывает? В чем проблема. атрибут Сначала он соответствует полям в таблицах базы данных, в то время как в начале он соответствует полям в таблицах базы данных. отношение Он добавляется последней программой. Чтобы не потерять обновление, последнее переопределяет первое, что очень правильно.

Хотя этого следует тщательно избегать при использовании отношение и атрибут Если вы попали в свойство с тем же названием, но время от времени будете сталкиваться с ~, просто обратите на это немного внимания. Это неправда. Ошибка Это нормальное явление, которое неизбежно возникнет при текущем режиме обработки процедур.

Оригинал: “https://developpaper.com/laravel-framework-model-object-to-json-string-lost-update/”