Laravel:更新嵌套的json对象



我的数据库中有一列用于保存用户设置。这就是数据结构的样子:

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

然后,您可以更新用户的"偏好"属性(仅作为示例(:

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

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

最新更新