Поле Laravel JSON не может обновляться или updateOrCreate, если не существует - PullRequest
0 голосов
/ 02 октября 2018

Использование Laravel 5.6.У меня есть поле JSON с именем metas Вставка и обновление работает, как и ожидалось, за исключением одной вещи: если поле не существует в metas, оно не будет создано в методах update или updateOrdCreate.Поля, которые существуют, обновляются без проблем.

Вот пример metas содержимое:

{
    "date": "2018-09-17",
    "name": "r08"
}

Я могу обновить «дату» и «имя», но в некоторых ситуациях мне нужно добавить новое поле для образца »расстояние ", я не могу сделать это:

Registries::where('id', $registry_id)->update([
    'metas->distance' => '200km'
]);

Также пробовал:

Registries::where('id', $registry_id)->updateOrCreate([
    'metas->distance' => '200km'
]);

Нет ошибок.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

проверьте заполняемый массив в вашей модели реестров

0 голосов
/ 02 октября 2018

Laravel Приведение JSON создает для вас только JSON-аксессор (десериализатор) и мутатор (сериализатор):

Добавление приведения array к этому атрибуту автоматически десериализует атрибутк массиву PHP при доступе к нему в вашей модели Eloquent.

После определения cast вы можете получить доступ к атрибуту, и он будет автоматически десериализован из JSON в массив PHP.Когда вы устанавливаете значение атрибута, данный массив будет автоматически сериализован обратно в JSON для хранения

Так что единственный способ обновить поле JSON / массива - переопределить его значение:

$registry = Registries::find($registry_id);
$registry->metas['distance'] = '200km';
$registry->save();

или

Registries::updateOrCreate(
    ['id', $registry_id], 
    ['metas' => json_encode([
        'date' => '2018-09-17',
        'name'=> 'r08',
        'distance' => '200km',
    ])]
);
0 голосов
/ 02 октября 2018

Можете ли вы попробовать, как показано ниже.updateOrCreate() методу нужны два параметра массива, первый должен быть идентификатором, а второй должен содержать данные для создания обновления.

Registries::updateOrCreate([
    'id' => $registry_id
],[
    'metas->distance' => '200km'
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...