Laravel Eloquent有没有办法只更新Mysql json数据类型密钥?

时间:2016-07-07 13:55:24

标签: php json laravel-5.2

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

但有没有办法只更新密钥?

3 个答案:

答案 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]);

希望这有帮助!