From: Moritz Bunkus Date: Tue, 24 Nov 2020 12:26:22 +0000 (+0100) Subject: SL::DB::Object: Methode update_collections für One-To-Many-Relationships X-Git-Tag: kivitendo-mebil_0.1-0~9^2~623 X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/commitdiff_plain/9b16f8f89f00a7429f85144527a97d1168ea0000?hp=9b16f8f89f00a7429f85144527a97d1168ea0000 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. ---