我在数据库中有一列用于保存用户设置。数据结构如下所示:
{"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);
得到我:
array:2 [
"Foo" => true
"Bar" => true
]
太好了-值现在正在拾取从axios请求传入的值。接下来更新用户数据:
$user->update(compact('preferences'));
现在我的数据如下:
{"Foo":true,"Bar":true}
这些值不再嵌套;我已经消灭了email
和subscriptions
。
我已经尝试过了:
$user->update([$user->preferences['email']['subscriptions'] => json_encode($preferences)]);
但是它似乎没有保存数据。如何使用$preferences
变量更新数据-并使数据正确嵌套?
答案 0 :(得分:1)
您可以使用所需的结果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();