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}
值不再嵌套;我已经删除了 email
和 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
]
]);
然后您可以更新用户 'preferences' 属性(仅作为示例):
User::where('id', auth()->user()->id)->update(['preferences' => $json_preferences]);
或
$user = auth()->user();
$user->preferences = $json_preferences;
$user->save();
我的数据库中有一列用于保存用户的设置。数据结构如下所示:
{"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}
值不再嵌套;我已经删除了 email
和 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
]
]);
然后您可以更新用户 'preferences' 属性(仅作为示例):
User::where('id', auth()->user()->id)->update(['preferences' => $json_preferences]);
或
$user = auth()->user();
$user->preferences = $json_preferences;
$user->save();