Я использую это для вставки данных в формате 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 ....






Как в примере с Доком нельзя, нужно взять объект JSON (как массив), изменить его, а затем вернуть обратно.
$entity = Table::where('id', 1);
$car = $entity->car;
$car['model'] = 'Aicon';
$entity->car = $car;
$entity->save();
Ух ты, здорово! Спасибо, дружище, это как раз то, что мне нужно.
Вы не можете напрямую изменять дочерний узел атрибута, поскольку технически он не существует в модели. Прокрутите вверх всего на несколько делений в ссылке на документацию, которой вы поделились, и прочитайте Аксессоры и мутаторы, или просто определите свойство должным образом.
Если вы не хотите автоматически преобразовывать 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();
Спасибо за предложение, но я собираюсь использовать для этого решение @Thomas Edwards.
В любом случае он был первым в гонке ^ _ ^
Если столбец приведен как столбец JSON, то обновление очень просто с помощью средства доступа со стрелкой:
Бросать:
protected $casts = [
'car' => 'json',
];
Обновление:
Table::find(1)->update(['car->model' => 'Aicon']);
Подробнее о столбцах JSON в Laravel в недавней статье блога, которую я написал: https://nulloughtts.com/development/2019/01/29/laravel-json-column-types/
Редактировать: Если вы объявляете столбец как $fillable, я считаю, что вам придется добавить каждое свойство для массового назначения с помощью инструмента доступа со стрелкой:
protected $fillable = [
'car->model',
];
Спасибо, @Makyen, я быстро поискал, разрешено ли это вообще, пока торопился опубликовать свой ответ. Как и в любом другом случае, вы узнаете больше по ходу дела, поэтому я ценю информацию на раннем этапе. Я отредактировал сообщение, чтобы отразить, что ссылка ведет на мой собственный блог.
Ты меня опередил, аргу!