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.
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.
In Yii2 ist es nur ein einfaches
%Vor% Also in diesem Fall unset($a->b)
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%$ 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