2017-08-29 2 views
0

Ich habe einen komplexen Datensatz in Sitzung gespeichert. Ich möchte Teile dieses Datensatzes in der Sitzung aktualisieren und anschließend die DB-Zeile mit den Sitzungsdaten aktualisieren. Bisher ist es mir gelungen, die gesamte Struktur und nicht nur den Teil davon zu überschreiben, den ich beabsichtige.Laravel Sitzungsvariable wird nicht aktualisiert

Beispiel:

base    <-- whole record 
base.field1   <-- single field 
base.field2   <-- single field 
base.field3   <-- single field 
base.users   <-- array of objects (users), stored as JSON column 
base.details  <-- single dimensional array of fields 
base.cards   <-- array of objects (cards), stored as JSON column 
base.regions  <-- array of objects (regions), stored as JSON column 

Diese ganze Struktur wird als eine Zeile in einer progress Tabelle gespeichert.

ich laden und speichern diese Daten in der Sitzung wie folgt aus:

session()->put('base', Progress::find($id)); 

ich dann einige der Felder in der Karten-Array aktualisiert:

$cards = session()->get('base.cards'); 
$cards[$index]['points'] = 100; 

ich dann versuchen, (erfolglos) aktualisieren die Session-Variable, nachdem beide unten versucht:

session()->put('base.cards', $cards); 
session()->push('base.cards', $cards); 
session('base.cards', $cards); 

Dann möchte ich diesen Datensatz in t speichern er Tabelle Fortschritt durch seine Instanz zu aktualisieren, wie folgt aus:

Progress::find($id)->update(session()->get('base')); 

Wie manipulieren ich dann in der Sitzung aktualisieren nur eine der JSON/Array-Felder?

UPDATE: Ich fügte hinzu:

session()->put('base.cards', $cards); 
session()->save(); 

Aber noch, wenn ich dd(session()->get('base')) erhalte ich die $cards Array ?!

+0

tun Wo nennst du 'Session :: Speichern() 'in deiner App? – Tschallacka

+0

Ich nicht. Muss ich? Taylors Dokumente erwähnen das nicht? – TheRealPapa

+0

Ja, du musst. In der Regel wird am Ende Ihres Programmablaufs, wenn Ihre App beendet wird, normalerweise ein Aufruf von Session :: save() eingefügt. Dadurch wird sichergestellt, dass die Sitzungsdaten in den Sitzungstreiber geschrieben werden. – Tschallacka

Antwort

1

Ich würde vorschlagen, dass Ihr Problem dadurch verursacht wird, dass Sie Session auf eine Weise verwenden, die nicht beabsichtigt war. Sie scheinen ein Eloquent-Modell namens Progress in der Sitzung mit dem Schlüssel 'base' zu speichern und erwarten dann die Methoden get, put und push von Session, um zu verstehen, wie Sie mit den Parametern Ihres Modells interagieren.

Wie wäre es Ihnen das Leben einfacher machen und speichern nur die ID in der Session ...

$progress = Progress::find($id); 
session()->put('progress_id', $progress->id); 
session()->save(); 

Und dann, wenn Sie es wollen, ziehen Sie in der Datenbank zu manipulieren, speichern usw. dies tun ...

$progress_id = session()->get('progress_id'); 
$progress = Progress::find($progress_id); 
$progress->cards = $cards->asJSON(); // Give your cards model a method that serialises itself 
$progress->save(); 

Insgesamt ist Ihr Code jetzt einfacher zu lesen und alles wird auf eine sehr "normale" Art und Weise verwendet. Die Sitzung enthält nur eine ID, das Modell existiert als ein korrektes beredtes Modell, auf das in der dokumentierten Weise zugegriffen wird.

Zukunft werden Sie dankbar sein, wenn er diesen Code :-)

Oh Bewertung kommt, und wenn Sie das Modell in der Sitzung wurden die Speicherung, weil Sie sich Sorgen über die Geschwindigkeit, einen einzelnen Datensatz aus einer richtig ziehen Indizierte Datenbank ist wahrscheinlich nicht langsamer als die Daten aus einer Sitzung zu ziehen. Wir sprechen tausende von Sekunden, aber bitte führen Sie Tests durch, um Ihre Gedanken zu beruhigen.

0

Komplexe Strukturen, die vom Sitzungsspeicher unterstützt werden, sind auf Arrays beschränkt.

Um in Schlüsselnamen von . Syntax profitieren, müssen Sie das Modell Array konvertieren, zB:

session()->put('base', Progress::find($id)->toArray()); 

So können Sie später

session()->put('base.cards', $cards);