[ERLEDIGT] $model->save() soll nur geänderte Werte updaten

Ich habe mal einen MySQL Proxy zwischen Yii und meiner Datenbank geschaltet und dabei festgestellt dass das Model immer alle Attribute in der Datenbank updated - auch ungeänderte. Wollte mal fragen ob man das Verhalten (auf einfache Weise) ändern kann?

Beispiel

Eine Tabelle enthält folgende Spalten:

  • name

  • password

  • email

  • privileges

Datensatz: (‘Testuser’, ‘Password’, ‘sag@ich.net’, 0)

Jetzt will ich zum Beispiel die Privilegien ändern:

[PHP]

$model = User::model()->findByPk(1);

$model->privileges = User: :P _ADMIN;

$model->save();

[/PHP]

Der Proxy zeigt jetzt folgende Ausgabe:

[SQL]UPDATE User SET name = ‘Testuser’, password = ‘Password’, email = ‘sag@ich.net’, privileges = 1 WHERE id = 1;[/SQL]

Ich will aber (aus Performancegründen) das einfach nur die entsprechende Spalte aktualisiert wird also:

[SQL]UPDATE User SET privileges = 1 WHERE id = 1[/SQL]

Wie stell ich das am besten an? Mit direktem SQL Code? (Würde gerne alles mit AR machen).

Danke schonmal

AR müsste sich dann die ausgelesenen Werte aus der DB merken und vor dem Speichern prüfen, welche sich geändert haben. Das ist nicht implementiert und soweit ich weiß auch nicht geplant. AR soll ja relativ schlank bleiben. Wenn du sowas machen möchtest, könntest du evtl. deine eigene Klasse von AR ableiten und dort dann die enstprechenden Mechanismen einbauen, indem du z.B. afterFind/beforeSave überschreibst.

In afterFind() müsstest du alle ausgelesenen Attribute in einem eigenen Array nochmal sichern. In beforeSave() vergleichst du dann die tatsächlichen Attributwerte mit deinen gespeicherten, führst ein saveAttributes() mit den geänderten Attributen aus und machst am Ende return false, damit nicht nochmal save() durchgeführt wird.

Danke für die schnelle Hilfe!

Werde wohl mal einen performancefilter drüberlaufen lassen um zu sehen ob sich das lohnt.