Laravel Eloquent 有没有办法只更新 Mysql json 数据类型键


Laravel Eloquent is there a way to update Mysql json datatype key only?

我在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]);

希望这有帮助!