In Laravel können Sie das tun:
%Vor%Problem ist, wenn ich Änderungen an Objekten an diesem Objekt vornehme, gibt es mir, was vor meinen Änderungen dort war. Wie aktualisiere ich das Objekt, um die neuesten Werte zu erhalten? I.e. Um es zu zwingen, die spätesten Werte von der DB zu erhalten?
Laravel macht das schon für dich. Immer wenn du Auth::user()
machst, macht Laravel
Nullt den aktuellen Benutzer und wenn er protokolliert wird, rufen Sie ihn erneut unter Verwendung der in der Sitzung gespeicherten protokollierten ID ab.
Wenn es nicht so funktioniert, wie es sollte, haben Sie etwas anderes in Ihrem Code, das wir hier nicht sehen, und diesen Benutzer für Sie zwischenspeichern.
Sie können das Cache-Objekt wie folgt aktualisieren.
%Vor%für Beispiel
%Vor%Laravel tut das für Sie, aber Sie werden dieses Update nicht in Auth :: user () während derselben Anfrage sehen. Von /Illuminate/Auth/Guard.php (befindet sich direkt über dem Code, den Antonio in seiner Antwort erwähnt):
%Vor%Wenn Sie also versucht haben, den Benutzernamen von "Alter Name" in "Neuer Name" zu ändern:
%Vor% Und später in der gleichen Anfrage versuchen Sie, den Namen zu bekommen, indem Sie Auth::user()->name
überprüfen, es wird Ihnen "Alter Name" geben
log::error(Auth::user()->name)); // Will be 'Old Name'
[Diese Antwort ist besser für neuere Versionen von Laravel (nämlich Laravel 5)]
geeignet Beim ersten Aufruf von Auth::user()
holt es die Ergebnisse aus der Datenbank und speichert sie in einer Variablen.
Aber bei nachfolgenden Aufrufen holt es die Ergebnisse von der Variablen.
Dies wird aus dem folgenden Code im Rahmenwerk ersichtlich:
%Vor%Wenn wir nun Änderungen am Modell vornehmen, werden die Änderungen automatisch auf das Objekt angewendet. Es enthält NICHT die alten Werte. Daher gibt es normalerweise keine Notwendigkeit, die Daten erneut aus der Datenbank abzurufen.
Es gibt jedoch bestimmte seltene Umstände, unter denen das erneute Abrufen der Daten aus der Datenbank nützlich wäre (z. B. um sicherzustellen, dass die Datenbank ihre Standardwerte anwendet oder wenn Änderungen an dem Modell durch eine andere Anforderung vorgenommen wurden). Führen Sie dazu die Methode fresh()
wie folgt aus: