我在MySQL数据库中有数据,表"用户",json类型为"属性"列,如下所示:
{"hp": {"remaining": 10, "total": 10}, "mp": {"remaining": 5, "total": 5}}
我想在不更新整个 json 的情况下将 hp->剩余更新为 9,而只是键
第一种方法:
$user = Users::find(1)->firstOrFail();
$user->attributes->hp->remaining = 9;
$user->save();
它失败说间接修改重载属性应用程序''模型''用户::$attributes不起作用
第二种方法:
$user = Users::find(1)->firstOrFail();
$user->attributes = json_encode(array('hp' => array('remaining' => 9)));
$user->save();
它没有任何错误,但它失败了,因为它更新了整个 JSON 属性并丢失了"hp->total"键和所有 mp,因此变成了
{"hp": {"remaining": 9}}
我知道我可以用更新的密钥替换整个 json,例如:
$user = Users::find(1)->firstOrFail();
$user->attributes = json_encode(array(
'hp' => array('remaining' => 9, 'total' => 10),
'mp' => array('remaining' => 5, 'total' => 5)
));
$user->save();
但是有没有办法只更新密钥?
$str = '{"hp": {"remaining": 10, "total": 10}, "mp": {"remaining": 5, "total": 5}}';
$array=json_decode($str,true);
$array['hp']['remaining'] = 9;
$result = json_encode($array);
echo $result;
result is {"hp":{"remaining":9,"total":10},"mp":{"remaining":5,"total":5}}
hope use for you...
这应该可以完成工作(laravel 5.5)
$data = $user->attributes;
$data['hp']['remaining'] = 9;
$user->attributes = $data;
$user->save();
$user = Users::find(1)->firstOrFail();
$decode = json_decode($user,true); //use as an array
$uid = $decode["id"];
$remaining = $decode["hp"]["remaining"];
$remaining1 = $decode["mp"]["remaining"];
$encode_remaining = json_encode($remaining);
$encode_remaining1 = json_encode($remaining1);
$db = User::where("id","=",$uid)->update([$encode_remaining=> 9 , $encode_reamaining1 => 5]);
希望这有帮助!