Laravel Array & amp; JSON Casting

я использую этот вставить данные в формате JSON в таблицу. Я хотел бы знать, можно ли изменить одно свойство объекта JSON после того, как он вставлен в таблицу с несколькими свойствами. Например:

Table:
+----+----------------------------------+
| id |               car                |
+----+----------------------------------+
|  1 | {"brand": "audi", "model": "TT"} |
+----+----------------------------------+

$entity = Table::where('id', 1);
$entity->car['model'] = 'Aicon';

Код, похожий на этот, дает мне исключение 'ErrorException' with message 'Indirect modification of overloaded property ... has no effect' in ...,

0

Решение

Такой как в примере Дока Вы не можете, вы должны взять объект JSON (в виде массива), изменить его и затем вернуть обратно.

$entity = Table::where('id', 1);
$car = $entity->car;
$car['model'] = 'Aicon';
$entity->car = $car;
$entity->save();
2

Другие решения

Вы не можете напрямую изменить дочерний узел атрибута, поскольку он технически не существует в модели. Пролистайте несколько отметок в ссылке на документацию, которой вы поделились, и читайте дальше Аксессоры и мутаторы, в качестве альтернативы просто определите свойство правильно.

Если вы не хотите автоматически приводить JSON к массиву, как указывал @Thomas Edwards, вы можете определить мутатор, который, по сути, делает то же самое, но вы можете изменить его, как пожелаете:

public function getCarAttribute($value)
{
return json_decode($value, true);
}

Затем добавьте ваши новые атрибуты в измененное поле:

$entity = Entity::find(1);

$car = $entity->car;
$car['model'] = 'Aicon';
$car['color'] = 'Blue';

$entity->car = $car;
$entity->save();
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector