SL::DB::Object: Methode update_collections für One-To-Many-Relationships
authorMoritz Bunkus <m.bunkus@linet.de>
Tue, 24 Nov 2020 12:26:22 +0000 (13:26 +0100)
committerMoritz Bunkus <m.bunkus@linet.de>
Wed, 25 Nov 2020 14:25:29 +0000 (15:25 +0100)
commit9b16f8f89f00a7429f85144527a97d1168ea0000
tree67bc70ab6569325a7f9c9f0092c8e38eb207d2b0
parentb9cd11d78faef7815e435c11aa6a12793e9cb9c9
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.
SL/DB/Object.pm