Laravel Array и JSON кастинг

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
2 026
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

Ты меня опередил, аргу!

Stephen Lake 09.11.2018 16:59

Ух ты, здорово! Спасибо, дружище, это как раз то, что мне нужно.

niksrb 09.11.2018 17:14

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

Если вы не хотите автоматически преобразовывать 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.

niksrb 09.11.2018 17:15

В любом случае он был первым в гонке ^ _ ^

Stephen Lake 09.11.2018 17:16

Если столбец приведен как столбец 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, я быстро поискал, разрешено ли это вообще, пока торопился опубликовать свой ответ. Как и в любом другом случае, вы узнаете больше по ходу дела, поэтому я ценю информацию на раннем этапе. Я отредактировал сообщение, чтобы отразить, что ссылка ведет на мой собственный блог.

nullthoughts 21.09.2019 04:24

Другие вопросы по теме