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

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

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

#1 User is offline   Coksnuss 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 140
  • Joined: 14-May 09

Posted 18 August 2009 - 04:35 AM

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:
$model = User::model()->findByPk(1);
$model->privileges = User: :P _ADMIN;
$model->save();


Der Proxy zeigt jetzt folgende Ausgabe:
UPDATE `User` SET `name` = 'Testuser', `password` = 'Password', `email` = 'sag@ich.net', `privileges` = 1 WHERE `id` = 1;


Ich will aber (aus Performancegründen) das einfach nur die entsprechende Spalte aktualisiert wird also:
UPDATE `User` SET `privileges` = 1 WHERE `id` = 1


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

Danke schonmal
0

#2 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 18 August 2009 - 05:42 AM

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.
1

#3 User is offline   Coksnuss 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 140
  • Joined: 14-May 09

Posted 18 August 2009 - 06:09 AM

Danke für die schnelle Hilfe!
Werde wohl mal einen performancefilter drüberlaufen lassen um zu sehen ob sich das lohnt.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users