Wie erzwingt man, den Wert des Modells in yii zu aktualisieren

8

sagen wir, ich habe Modell A in Bezug auf B.

Wenn ich schreibe:

%Vor%

und jetzt kann B geändert werden (z. B. von einem anderen Benutzer). Wenn ich schreibe:

%Vor%

es verwendet alte Werte von B. Was ich tun sollte, um zu zwingen, den Wert von B vor doSomething () zu aktualisieren.

    
liysd 14.07.2010, 04:32
quelle

5 Antworten

16

Yii bietet eine refresh () -Methode, nach der Sie suchen?

Ссылка

    
Sniper 19.07.2010, 21:39
quelle
10

Sie können einen aktualisierten "B" -Wert erhalten, indem Sie sagen:

%Vor%

Der zweite Parameter "true" fragt, dass yii die Relation von der Datenbank neu lädt.

    
Karen Zilles 13.03.2013 22:27
quelle
4

In Yii2 ist es nur ein einfaches

%Vor%

Also in diesem Fall unset($a->b)

    
Bruce Aldridge 25.03.2015 22:56
quelle
0

Wie ich es verstehe, wenn die Beziehung B in A-Modell deklariert wird, wird das Objekt B "lazy loaded" aus der Datenbank, wenn Sie $ a- & gt; B aufrufen. Es sei denn, es wird zwischengespeichert (was es standardmäßig nicht tut, denke ich nicht), sollte es jedes Mal, wenn Sie diese Beziehung aufrufen, eine neue Kopie von B holen.

Ich würde sicherstellen, dass, wenn doSomething () die Daten in B ändert, dass Sie auch $ this- & gt; save () in B- & gt; doSomething () aufrufen. Wenn Sie B ändern, aber die Änderungen nicht speichern, hat derselbe Inhalt bei der erneuten Abfrage von B denselben alten Inhalt.

%Vor%

Wenn Sie nach dem Ändern von B erneut auf zugreifen möchten, bevor Sie es gespeichert haben , müssen Sie es in einer Variablen in A setzen, um es "zu cachen". Andernfalls, da es eine neue Kopie von der Datenbank erhält, wenn Sie $ a- & gt; B aufrufen (und Sie die Änderung in doSomething () nicht gespeichert haben), werden Sie die alten Daten haben. So etwas funktioniert stattdessen:

%Vor%

Wenn es sich um ein allgemeines Nebenläufigkeits-Problem handelt (was sich anhört, wenn Sie sagen "es wurde von einem anderen Benutzer geändert"), müssen Sie möglicherweise eine Art Sperrmechanismus implementieren oder mySql-Transaktionen verwenden (über Yi's CDbTransaction) um die Datenintegrität sicherzustellen.

Wenn das alles nicht funktioniert, wird vielleicht auch Ihr Problem durch einen "eifrigen" Ladevorgang behoben:

%Vor%     
thaddeusmt 16.07.2010 20:12
quelle
0

$ a- & gt; B- & gt; refresh (); // um nur B zu aktualisieren

$ a- & gt; refresh (); // um a und alle natürlich alle Relationen einschließlich "B"

zu aktualisieren     
Marius Gri 02.02.2017 15:46
quelle

Tags und Links