No aplicativo Laravel 11 / PHP 8.2, preciso adicionar vários valores ao campo de valor JSON do modelo UserOption e faço isso com código:
array_push($this->selectedCurrencies, array_values($userOption->value));
$userOption->value = array_values($this->selectedCurrencies);
$userOption->save();
Mas no campo de valor vejo novos elementos e um subarray de valores antigos, não o array plano que preciso?
Como consertar isso?
Você está fornecendo um único valor como o segundo argumento para
array_push
, o que significa que o$userOption->value
array inteiro está sendo anexado como um valor. Eu sugiro que você queira expandi-lo e adicionar todos os elementos individualmente, por exemplo, usando...array_values($userOption->value)
:Veja https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list
Se o campo de valor for um json para fazer o que você quer, você precisa primeiro decodificar o campo de valor de json para um array por meio de json_decode. Além disso, parece-me que o que você está tentando fazer é concatenar o array selectedCurrencies com o array value em um array exclusivo e armazená-lo no modelo.
Estou usando json_encode somente se você quiser salvar o novo array como um Json. Se você quiser um array, pode evitar usar json_encode.
Nem todo modelo com um campo json serializado será projetado para decodificar automaticamente o campo toda vez que ele for recuperado. Por exemplo, vamos imaginar uma situação em que o projeto no qual você está trabalhando tem mais tipos de solicitações que precisam trabalhar com esse campo, como chamadas AJAX, por exemplo, que funcionam melhor com um JSON. Nesse caso, não é certo que você terá casts para esse modelo. Então, Json_decode nesse caso é mais seguro. Você não corre o risco de esquecer que o modelo não tem casts para o campo JSON de interesse. Por outro lado, se você começar a pensar toda vez que a decodificação é automática, estará mais vulnerável a erros como não incluir json_decode para modelos que não têm casts para o campo com o qual você está trabalhando.