Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 9b16f8f8

Von Moritz Bunkus vor mehr als 3 Jahren hinzugefügt

SL::DB::Object: Methode update_collections für One-To-Many-Relationships

Der große Nachteil einer direkten Zuweisung wie
z.B. `$customer->shiptos($::form->{shiptos} // [])` ist, dass Rose
erst mal alle Objekte der Relationship löscht (auch wenn die neuen
Werte Primärschlüsselattribute enthalten) und anschließend neu
INSERTed, was nicht nur deutlich zu aufwändig ist, sondern auch mal
nicht funktionieren kann, wenn es da noch weitere Objekte mit
Fremdschlüsseln auf die zu aktualisierenden Objekte verweisen.

Daher muss man die Behandlung (neu hinzuzufügende, zu löschende & zu
aktualisierende Objekte) selber vornehmen. Das macht nun diese
Methode.

Die Methode gleicht eine Liste von existierenden Objekten einer
One-To-Many-Relationship (z.B. Kunde zu Lieferadressen) mit einer
neuen Liste von Hashrefs ab, die z.B. aus `$::form` stammen können.

Für alle Einträge aus der neuen Liste, die kein Attribut für den
Primärschlüssel enthalten, werden neue Einträge in der Datenbank
angelegt.

Für alle Einträge aus der neuen Liste mit Primärschlüsselattribut wird
das korrespondierende Objekt mit den Werten aus `$::form`
aktualisiert.

Alle existierenden Objekte in `$self->$attribute`, für die es keinen
korrespondierenden Eintrag in der neuen Liste mehr gibt, werden
gelöscht.

  • hinzugefügt
  • geändert
  • kopiert
  • umbenannt
  • gelöscht