OK habs jetzt endlich. Funktioniert soweit ganz gut mit der CAdvancedArBehavior Extension.
Also meine Relation im Model sieht nun wie folgt aus:
return array(
'friends' => array(self::MANY_MANY,
'User',
'tbl_user_friend(user_id, user_friend_id)',
)
);
In der jeweiligen Methode, die beim speichern des Models auch die many to many Tabelle updaten soll, füge ich vor dem Aufruf von save() folgendes ein:
$model->attachBehavior('CAdvancedArBehavior', array('class' => 'application.extensions.CAdvancedArBehavior.CAdvancedArBehavior'));
Das Anhängen kann optional auch in der behaviors Methode des Models geschehen
, führt aber dazu, dass bei jedem Speichervorgang des Models, alle Datensätze in der Relationen-Tabelle gelöscht und neu erstellt werden. Ich denke mit attachBehavior() ist das ganze etwas effizienter.
In der Extension musste ich eine kleine Änderung vornehmen …
//$foreignobject = $foreignobject-{$foreignobject->$relation['m2mForeignField']};
// ersetzen mit
$foreignobject = $foreignobject->getPrimaryKey();
… da sonst im Model nach der Eigenschaft ‘user_friend_id’ gesucht wurde. Das ist aber nur der Name der Spalte in der Relationen-Tabelle. Nach der Änderung wird einfach der Primary-Key genommen.
So können jetzt die Relationen, in meinem Fall ‘friends’, erstellt werden:
$friends = array();
// PKs der vorhandenen Freunde in $friends[] ablegen.
foreach($model->friends as $friend) {
$friends[] = $friend->id;
}
// neuen Freund hinzufügen
$friends[] = User::model()->findByPk(64);
$model->friends = $friends;
// Beim Aufruf von $model->save() wird die Relationen Tabelle nun aktualisiert
Das ganze ist jetzt nur noch etwas ineffizient, da beim update der Relationen-Tabelle alle Datensätze gelöscht und neu eingefügt werden. Sprich, bei 200 Freunden des Users führt ein update zu 200 Querys, um die Freunde-Tabelle zu aktualisieren.
Wenn ich das etwas effizienter hinkriege poste ich es hier. Wenn jemand Tipps hat bezüglich der Effizienz, sind diese hier gerne willkommen.
Danke an kokomo für die Tipps und danke an thyseus für die Extension.