2016-07-07 1 views
1

Ich habe Daten in MySQL db, Tabelle 'user', Spalte 'Attribute' mit json Typ wie folgt:Laravel Eloquent gibt es eine Möglichkeit, nur Mysql JSON-Datentyp Schlüssel zu aktualisieren?

{"hp": {"remaining": 10, "total": 10}, "mp": {"remaining": 5, "total": 5}} 

I hp- aktualisieren möchten> bis 9 verbleibt, ohne die gesamte json modernisiert werden, aber nur der Schlüssel

1. Methode:

$user = Users::find(1)->firstOrFail(); 
$user->attributes->hp->remaining = 9; 
$user->save(); 

es versäumt indirekte Änderung der überlasteten Eigentum App \ Models \ Users :: $ Attribute sagen hat keine Auswirkung

2. Methode:

$user = Users::find(1)->firstOrFail(); 
$user->attributes = json_encode(array('hp' => array('remaining' => 9))); 
$user->save(); 

es ergaben sich keine Fehler, aber es scheiterte, weil es die ganze json Attribute aktualisiert und verloren ‚HP-> total‘ Schlüssel und alle mp, wurde so

{"hp": {"remaining": 9}} 

ich weiß, ich kann nur die ganze json mit aktualisierten Schlüssel ersetzen wie:

$user = Users::find(1)->firstOrFail(); 
$user->attributes = json_encode(array(
             'hp' => array('remaining' => 9, 'total' => 10), 
             'mp' => array('remaining' => 5, 'total' => 5) 
            )); 
$user->save(); 

Allerdings ist es eine Möglichkeit, nur den Schlüssel zu aktualisieren?

+0

dekodieren die JSON-String in ein Array und aktualisieren Sie dann die Abfrage .. –

+0

können Sie nicht. json ist ein Containerformat und sollte niemals direkt manipuliert werden. dekodieren Sie eine native Struktur, ändern Sie die gewünschten Werte, und dekodieren Sie sie erneut in json. alles andere birgt das Risiko, die JSON zu korrumpieren. –

Antwort

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... 
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]); 

hoffe, das hilft!

0

Dies sollte die Arbeit (Laravel 5.5) tun

$data = $user->attributes; 
$data['hp']['remaining'] = 9; 
$user->attributes = $data; 
$user->save();