Laravel:更新嵌套的 json 对象

Laravel: Update a nested json object

我的数据库中有一列用于保存用户的设置。数据结构如下所示:

{"email":{"subscriptions":"{\"Foo\":true,\"Bar\":false}"}}

我正在使用 vue 切换来更改每个 属性 (true/false) 的状态。一切似乎都在工作,但是当我保存时,我正在清除结构并保存更新的值,如下所示:

{\"Foo\":true,\"Bar\":false}"}

php

$user = auth()->user();
$array = json_decode($user->preferences['email']['subscriptions'], true);
dd($array);

以上内容让我明白了:

array:2 [
    "Foo" => true
    "Bar" => false
]

到目前为止一切顺利...

$preferences = array_merge($array, $request->all());

dd($preferences);

得到我:

array:2 [
    "Foo" => true
    "Bar" => true
]

太棒了 - 这些值现在正在获取从 axios 请求传入的值。接下来;更新用户数据:

$user->update(compact('preferences'));

现在我的数据是这样的:

{"Foo":true,"Bar":true}

值不再嵌套;我已经删除了 emailsubscriptions

我试过这个:

$user->update([$user->preferences['email']['subscriptions'] => json_encode($preferences)]);

但是好像没有保存数据。我如何使用 $preferences 变量来更新数据 - 并保持数据正确嵌套?

您可以创建一个数组,其中包含您希望生成的 json 具有的结构。所以,对于这个 json:

{
    "email":{
        "subscriptions":{
                "Foo":true,
                "Bar":false
        }
    }
}

你可以这样创建一个数组:

[
    'email' => [
        'subscriptions' => [
            'Foo' => true,
            'Bar' => false
        ]
    ]
]

然后,对整个结构进行编码:

json_encode([ 
    'email' => [ 
        'subscriptions' => [
            'Foo' => true, 
            'Bar' => false
        ] 
    ] 
]);

因此,在您的代码中,由于 $preferences 变量中已经有嵌套数组,我认为这应该可行:

$json_preferences = json_encode([ 
    'email' => [ 
        'subscriptions' => $preferences 
    ] 
]);

然后您可以更新用户 'preferences' 属性(仅作为示例):

User::where('id', auth()->user()->id)->update(['preferences' => $json_preferences]);

$user = auth()->user();
$user->preferences = $json_preferences;
$user->save();