Laravel:更新嵌套的 json 对象

2024-01-12

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

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

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

{\"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);

Gets me:

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

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

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

现在我的数据如下所示:

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

这些值不再嵌套;我已经消灭了email and subscriptions.

我试过这个:

$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 
    ] 
]);

然后您可以更新用户“首选项”属性(仅作为示例):

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

or

$user = auth()->user();
$user->preferences = $json_preferences;
$user->save();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel:更新嵌套的 json 对象 的相关文章

随机推荐