Speichern von Objektbäumen inkl. Beziehungen

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Speichern von Objektbäumen inkl. Beziehungen

Beitrag von MrNiceGuy » 07.08.2009, 17:24:13

Wie sieht es mit "verschachtelten" Objekten aus? Mal angenommen ich möchte 2 neue Datensätze anlegen, die miteinander kombiniert werden sollen über eine Relation. Würde es dann ausreichen, wenn ich jeweils 2 Objekte erstelle, die Daten reinspeichere und das eine Objekt dem anderen in Relation stelle und nur ein Mal die saveObject()-Methode aufrufe? Das wäre unheimlich toll, setzt jedoch voraus, dass vor der Erstellung aller Verknüpfungen die Datensätze der ent_*-Tabellen gespeichert werden!? Müsste doch eigentlich machbar sein?!
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4525
Registriert: 04.11.2007, 16:13:53

Re: Erweiterung GORM (Release 1.11)

Beitrag von dr.e. » 07.08.2009, 18:24:41

Hallo Lutz,

Wie sieht es mit "verschachtelten" Objekten aus? Mal angenommen ich möchte 2 neue Datensätze anlegen, die miteinander kombiniert werden sollen über eine Relation. Würde es dann ausreichen, wenn ich jeweils 2 Objekte erstelle, die Daten reinspeichere und das eine Objekt dem anderen in Relation stelle und nur ein Mal die saveObject()-Methode aufrufe?

Na klar. Das geht auch jetzt schon. Du kannst z.B. gleichzeitig ein Gästebuch mit zwei initialen Einträgen anlegen:

Code: Alles auswählen

$gb = new GenericDomainObject('Guestbook');
$entry1 =  new GenericDomainObject('Entry');
$entry2 =  new GenericDomainObject('Entry');
$gb->addRelatedObject('Guestbook2Entry',$entry1);
$gb->addRelatedObject('Guestbook2Entry',$entry1);
$orm->saveObject($gb);


Das wäre unheimlich toll, setzt jedoch voraus, dass vor der Erstellung aller Verknüpfungen die Datensätze der ent_*-Tabellen gespeichert werden!? Müsste doch eigentlich machbar sein?!

Die Voraussetzung für das obige ist lediglich, dass alle Beziehungen in der Konfiguration vorhanden sind. Ansonsten kannst du beliebig komplexe (nicht-zirkuläre) Objektbäume speichern. Obiges Beispiel lässt sich dann beliebig erweitern:

Code: Alles auswählen

$gb = new GenericDomainObject('Guestbook');
$entry1 = new GenericDomainObject('Entry');
$comment1 = new GenericDomainObject('Comment');
$entry1 ->addRelatedObject('Entry2Comment',$comment1);

$entry2 = new GenericDomainObject('Entry');
$comment2 = new GenericDomainObject('Comment');
$entry2 ->addRelatedObject('Entry2Comment',$comment2);

$gb->addRelatedObject('Guestbook2Entry',$entry1);
$gb->addRelatedObject('Guestbook2Entry',$entry1);
$orm->saveObject($gb);

Das Speichern des im Code-Block gezeigten Baumes generiert für alle Objekte neue Einträge in der Datenbank. Wenn du bereits existierende Objekt mit ins Spiel bringen möchtest (z.B. eine Sprache) kann das wie folgt in einem Setup-Script passieren:

Code: Alles auswählen

$lang = new GenericDomainObject('Language');
$langId = $orm->saveObject($lang);
$lang->setProperty('LanguageID',$langId);

$gb = new GenericDomainObject('Guestbook');

$entry1 =  new GenericDomainObject('Entry');
$entry1->addRelatedObject('Entry2Language',$lang);

$entry2 =  new GenericDomainObject('Entry');
$entry2->addRelatedObject('Entry2Language',$lang);

$gb->addRelatedObject('Guestbook2Entry',$entry1);
$gb->addRelatedObject('Guestbook2Entry',$entry1);
$orm->saveObject($gb);

Damit erzeugst du jeweils eine Beziehung von jedem Entry zu einer Language.

PS: ich habe den Thread unter FAQ verschoben, da ich denke, dass er dort besser aufgehoben ist.

Viele Grüße,
Christian
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast