Laravel Array & JSON casting - PullRequest
       0

Laravel Array & JSON casting

0 голосов
/ 09 ноября 2018

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

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

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

Если вы не хотите автоматически приводить 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();
0 голосов
/ 09 ноября 2018

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

$entity = Table::where('id', 1);
$car = $entity->car;
$car['model'] = 'Aicon';
$entity->car = $car;
$entity->save();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...