Как обновить столбец eloquent json на основе данных проверки, не переписывая то, что хранится в столбце?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как обновить столбец eloquent json на основе данных проверки, не переписывая то, что хранится в столбце?

Сообщение Anonymous »

Я надеюсь на простое решение, но пока ничего не получается...

У меня есть интерфейс Приложение/форма vue, которая отправляет данные обратно в мой бэкэнд laravel - у меня есть контроллер, который проверяет и сохраняет запрос (в данный момент я не ищу отзывов об этой архитектуре, если только она действительно не решит проблему - это задача на другой день... )

Я добавил столбец json под названием «custom_redeem_fields»
Для контекста: он обеспечивает большую гибкость и принимает пары ключ/значение для использования в другом поле называемый «custom_redeem_instructions», который содержит текст с разделителями для каждого из ключей из «custom_redeem_fields», хотя я бы предпочел не определять эти ключи статически, потому что весь смысл в том, чтобы иметь возможность добавлять новые ключи по своему желанию. Таким образом, custom_redeem_instructions будет читать что-то вроде «пожалуйста, посетите {•URL•} и введите код {•CODE•}...», и эти значения будут взяты из поля json custom_redeem_fields.
В модели у меня есть «custom_redeem_fields» в заполняемом массиве, а также установлено, что их можно привести к json.

Код: Выделить всё

protected $fillable = ['custom_redeem_fields'];
protected $casts = ['custom_redeem_fields' => 'json'];
В контроллере у меня есть около 20 дополнительных столбцов (здесь они не совсем актуальны, поэтому я включил только два), поэтому я стараюсь не вызывать их по отдельности. за пределами их правил проверки. Запрос обычно отправляет по одному полю за раз, поэтому пользователь может обновлять и сохранять каждое поле по мере его поступления. Это работало правильно для всех других полей, которые у меня были до того, как я добавил в смесь «custom_redeem_fields.xxxx».

Код: Выделить всё

$validatedData = $request->validate([
'title' => 'sometimes|required|max:255',
'text' => 'sometimes|required_unless:redeem_type,9|max:255',
'custom_redeem_fields.email' => 'sometimes|email',
'custom_redeem_fields.phone' => ['sometimes', new ValidPhone],
'custom_redeem_fields.code' => 'sometimes',
'custom_redeem_fields.url' => 'sometimes|url'
]);

$ticket = Ticket::find($id)
$ticket->update($validatedData);

Теперь, с «custom_redeem_fields.xxxxx», это разваливается — весь объект json, хранящийся в «custom_redeem_fields», перезаписывается самым последним обновлением, а не просто обновляется ключ, включенный в массив validatedData. Итак, если я сохраню:

Код: Выделить всё

[
"title" => "Monty Pythons Flying Circus"
"text" => "Monty Pythons Flying Circus is a British surreal sketch comedy series created by and starring the comedy group Monty Python, consisting of Graham Chapman, ..."
"custom_redeem_fields" => [
"email" => "bob@example.com",
"phone" => "503.555.5555",
"code" => "1xoicvjq",
"url" => "https://example.com/"
]
]
а затем отправляю:

Код: Выделить всё

"custom_redeem_fields" => ["email" => "pat@example.com"]


настраиваемые поля погашения возвращают:

Код: Выделить всё

"custom_redeem_fields" => ["email" => "pat@example.com"]


а не:

Код: Выделить всё

"custom_redeem_fields" => ["email" => "pat@example.com", "phone" => "503.555.5555", "code" => "1xoicvjq", "url" => "https://example.com/"]
Похоже, что правила проверки требуют, чтобы ключи json были обозначены точечным синтаксисом (

Код: Выделить всё

custom_redeem_fields.url
), а eloquent требует синтаксиса стрелок (

Код: Выделить всё

custom_redeem_fields->url
), но я не уверен, какой самый простой способ перехода между ними, который кажется очень не-laravel, и в этом отделе явно не хватает документации...

Будем благодарны за любую помощь.

Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/621 ... ver-writin
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»