我在MySQL db,table' user',column' attributes'中有数据。 json类型如下:
{"hp": {"remaining": 10, "total": 10}, "mp": {"remaining": 5, "total": 5}}
我想将hp->剩余更新为9而不更新整个json而只更新密钥
第一种方法:
$user = Users::find(1)->firstOrFail();
$user->attributes->hp->remaining = 9;
$user->save();
它没有说间接修改重载属性App \ Models \ Users :: $ 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();
但有没有办法只更新密钥?
答案 0 :(得分:1)
$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...
答案 1 :(得分:1)
这应该做的工作(laravel 5.5)
$data = $user->attributes;
$data['hp']['remaining'] = 9;
$user->attributes = $data;
$user->save();
答案 2 :(得分:0)
$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]);
希望这有帮助!