[GORM] ändern von related objects

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Antworten
Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

[GORM] ändern von related objects

Beitrag von Paric » 29.10.2014, 14:50:33

Mahlzeit,

und schon wieder habe ich ein Problem mit dem GORM. Diesmal geht es um Objektbäume, und Änderungen in diesen. Folgende Ausgangsstellung:
Für mein Projekt habe ich eine Verwaltung von verschiedenen Liegenschaften mit den dazugehörigen Telefonanlagen. Da in einigen Fällen aber für mehrere Liegenschaften die gleiche Telefonanlage zuständig ist, bot sich die Objektbaum-Lösung des GORM für mich an.
Mit dem Laden der Beziehungen klappt das auch super. Mein Problem ist, wenn ich eine Änderung an dem Liegenschaftsnamen vornehme, dann ändert er dies nicht, sondern legt eine neue Liegenschaft an.

Hier der dazugehörige Code:

Code: Alles auswählen

$ls = $oRM->loadObjectByID('liegenschaften', $liegenschaft->getLSId());

$Crit = new GenericCriterionObject();
$Crit->addPropertyIndicator('name', $liegenschaft->getNameAnlage());
$anl = $oRM->loadObjectByCriterion('anlagen', $Crit);

$anl->setProperty('name', $liegenschaft->getNameAnlage());

$prop = array('kurz' => $liegenschaft->getNameShort(),
              'lang' => $liegenschaft->getNameLong(),
              'aktiv' => ($liegenschaft->getActive()? 1:0));

$ls->setProperties($prop);

$ls->addRelatedObject('Liegenschaften2Anlagen', $anl);

$oRM->saveObject($ls);
 
hoffe Ihr seht was ich meine. Stecke da irgendwie in der Sackgasse.

Grüße,
Pit

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

Re: [GORM] ändern von related objects

Beitrag von dr.e. » 29.10.2014, 22:11:24

Hallo Pit,

das ist in der Tat etwas seltsam. Hast du mal versucht, $anl direkt zu speichern, bzw. die Beziehung umgekehrt aufzubauen:

Code: Alles auswählen

$anl->addRelatedObject('Liegenschaften2Anlagen', $ls);
$oRM->saveObject($anl); 
?

Falls da auch nicht geht, konfiguriere den GORM mal im Debug-Modus und poste mal die Statements, die ausgeführt werden (siehe http://adventure-php-framework.org/Seit ... ung-via-DI, Attribut conf.debug.value).
Viele Grüße,
Christian

Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

Re: [GORM] ändern von related objects

Beitrag von Paric » 30.10.2014, 11:43:36

Hallo Christian,

vielen Dank für die Gedankenanstöße. Nach langem hin- und herprobieren habe ich den Fehler gefunden:

Code: Alles auswählen

$prop = array('kurz' => $liegenschaft->getNameShort(),
              'lang' => $liegenschaft->getNameLong(),
              'aktiv' => ($liegenschaft->getActive()? 1:0));

$ls->setProperties($prop); 
die Funktion setProperties scheint die ObjectId zu löschen. Ist das so gewollt? Mit einer Änderung nach:

Code: Alles auswählen

$prop = array('kurz' => $liegenschaft->getNameShort(),
              'lang' => $liegenschaft->getNameLong(),
              'aktiv' => ($liegenschaft->getActive()? 1:0));
foreach ($prop as $key=>$val)
{
    $ls->setProperty($key, $val);
} 
behält er sein ObjectId.

Was das debuggen angeht, so hat er mir die Statements, trotz der Änderung nach

Code: Alles auswählen

conf.debug.method = "setLogStatements"
conf.debug.value = "true" 
nicht mitgeloggt. Was mache ich falsch? Leider habe ich nirgendwo einen Anhaltspunkt zur Konfiguration des debuggers gefunden. Im Log stehen nur die Fehlermeldungen.

falls es wen interessiert, eine Funktionierende Version meiner Funktion sieht so aus:

Code: Alles auswählen

public function saveLiegenschaft(Liegenschaft $liegenschaft)
{
    /* @var $oRM GenericORRelationMapper */
    $oRM = $this->getConnection();

    $ls = new GenericDomainObject('liegenschaften');

    $Crit = new GenericCriterionObject();
    $Crit->addPropertyIndicator('name', $liegenschaft->getNameAnlage());
    $anl = ($oRM->loadObjectCount('anlagen', $Crit) > 0)
            ? $oRM->loadObjectByCriterion('anlagen', $Crit)
            : new GenericDomainObject('anlagen');
    $anl->setProperty('name', $liegenschaft->getNameAnlage());

    $prop = array('kurz' => $liegenschaft->getNameShort(),
                  'lang' => $liegenschaft->getNameLong(),
                  'aktiv' => ($liegenschaft->getActive()? 1:0));

    foreach ($prop as $key=>$val)
    {
        $ls->setProperty($key, $val);
    }

    $ls->setObjectId($liegenschaft->getLSId());
    $oldAnl = $oRM->loadObjectByID('anlagen', $liegenschaft->getAnlId());
    $oldAnl->deleteAssociation('Anlagen2Liegenschaften', $ls);
    $anl->addRelatedObject('Anlagen2Liegenschaften', $ls);

    $oRM->saveObject($anl);
} 
beste Grüße,
Pit

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

Re: [GORM] ändern von related objects

Beitrag von dr.e. » 30.10.2014, 22:18:56

Hallo Pit,

schön, dass du den Fehler finden und beheben konntest! :)
die Funktion setProperties scheint die ObjectId zu löschen. Ist das so gewollt?
Grundsätzlich: ja. In diesem Fall wirkt sich das natürlich negativ aus, sie dient dem GORM jedoch das Objekt zu konsistent initialisieren. Um diesen Stolperstein auszumerzen gibt es IMHO zwei Optionen: die Objekt-ID ausnehmen, dann müsste der GORM die Initialisierung anders vornehmen, oder einen geeigneten Hinweis in die Doku schreiben. Was denkst du?
Was mache ich falsch? Leider habe ich nirgendwo einen Anhaltspunkt zur Konfiguration des debuggers gefunden. Im Log stehen nur die Fehlermeldungen.
An sich passt das! Der GORM schleift den Wert an den DB-Treiber durch und erzeugt einen Log-Eintrag (siehe z.B. APF\core\database\MySQLiHandler::executeTextStatement():538). Nutzt du den MySQLi-Treiber sollte eine Log-Datei mysqli angelegt werden. Ist das nicht der Fall, kann es jedoch sein, dass du für das Kürzel/Bezeichner keinen LogWriter registriert hast (siehe http://adventure-php-framework.org/Seit ... LogWritern bzw. http://adventure-php-framework.org/Seit ... ion-Logger). Hoffe das hilft dir!
Viele Grüße,
Christian

Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

Re: [GORM] ändern von related objects

Beitrag von Paric » 31.10.2014, 12:02:55

Hallo Christian,

ja, ich denke es sollte ein geeigneter Hinweis in der Doku genügen aus der hervorgeht das, wenn man eine explizite ObjectId ansprechen möchte, diese im Anschluss per $Obj->setObjectId($id) zu setzen.

Was den Logger betrifft, da raufen sich gerade meine Haare. Ich habe mich durch die Doku gewühlt, und bin gerade auf folgendem Stand:

bootstrap-Datei:

Code: Alles auswählen

use APFcoreloggingwriterStdOutLogWriter;
$logger = &Singleton::getInstance('APF\core\logging\Logger');
$logger->addLogWriter('stdout', new StdOutLogWriter());
$logger->addLogWriter('mysqli', new StdOutLogWriter());
$logger->addLogWriter('quatsch', new StdOutLogWriter());
 
den dritten Logwriter habe ich nur zum Test hinzugefügt.

mein Mapper beinhaltet:

Code: Alles auswählen

use APFcoresingletonSingleton;
use APFcoreloggingLogger;
use APFcoreloggingLogEntry;

public function loadLiegenschaften()
{
    // logger
    /* @var $logger Logger */
    $logger = &Singleton::getInstance('APF\core\logging\Logger');
    $logger->logEntry('quatsch', 'Testeintrag', LogEntry::SEVERITY_INFO);
} 
aufs wesentliche gekürzt. Er erstellt mir keinen Log-Eintrag. Wenn ich über die Funktion getRegisteredTargets() die Targets abfrage sind alle 3 + apf initialisiert. lasse ich den logEntry nach apf schreiben, so erstellt er ordnungsgemäß diesen Eintrag.
Was habe ich übersehen? Und wie bekomme ich die logEntrys vom GORM in meine mysqli-Log-Datei? Reicht es durch den Eintrag

Code: Alles auswählen

conf.debug.method = "setLogStatements"
conf.debug.value = "true" 
in der ini-Datei? Oder muß ich der ini-Datei noch das target mitteilen? wenn ja, wie? :D

Fragen über Fragen...

Gruß,
Pit

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

Re: [GORM] ändern von related objects

Beitrag von dr.e. » 01.11.2014, 15:53:29

Ich schaue mir das nochmal lokal genauer an und melde mich nochmal.
Viele Grüße,
Christian

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

Re: [GORM] ändern von related objects

Beitrag von dr.e. » 01.11.2014, 21:34:32

Hallo Pit,

ich hab mir deine Konfiguration lokal angesehen und denke, dass dein Log-Level nicht ausreichend hoch ist. Der GORM loggt bei eingeschaltenem

Code: Alles auswählen

conf.debug.method = "setLogStatements"
conf.debug.value = "true" 
die Inhalte korrekt im DEBUG-Mode. Der Logger schreibt jedoch nur diejenigen Einträge in eine Log-Datei, die oberhalb des konfigurierten Schwellwertes liegen (siehe Seite/023-Logger#Chapter-3-4-Schwellwert). Im Auslieferungszustand des APF wird

Code: Alles auswählen

$this->logThreshold = self::$LOGGER_THRESHOLD_WARN; 
als Threshold definiert. Dort ist DEBUG natürlich nicht enthalten. Um das Logging von DEBUG-Nachrichten zu aktiviern, kannst du in deiner index.php die Konfiguration des Loggers um ein

Code: Alles auswählen

$logger->setLogThreshold(Logger::$LOGGER_THRESHOLD_ALL); 
ergänzen und schon funktioniert das. ;)

Hoffe das hift dir weiter!
Viele Grüße,
Christian

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

Re: [GORM] ändern von related objects

Beitrag von dr.e. » 12.11.2014, 13:02:42

Hallo Pit,

konntest du die Konfigurations-Anpassung verwerten?
Viele Grüße,
Christian

Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

Re: [GORM] ändern von related objects

Beitrag von Paric » 20.11.2014, 11:58:17

Hallo Christian,

sorry für die fehlende Rückmeldung. Ja, hat alles super geklappt. und durch die Änderung in:

Code: Alles auswählen

$logger->addLogWriter('mysqli', new FileLogWriter()); 
schreibt er das ganze auch ordnungsgemäß in die Datei, anstatt das ganze auf dem Bildschirm anzuzeigen.

Danke für die Hilfe.

Gruß,
Pit

GeneralCrime
Beiträge: 67
Registriert: 14.12.2011, 07:13:16

Re: [GORM] ändern von related objects

Beitrag von GeneralCrime » 14.03.2015, 15:41:37

Als kleiner Tipp von mir:

Nutze für die Werte lieber direkte Funktionen wie
$Object->setkurz($liegenschaft->getNameShort())
->setlang($liegenschaft->getNameLong().....

Ich habe ein großest Projekt und hab immer setProperty und getProperty verwendet.
Nachteil war das sich so mehr Fehler eingeschlichen haben und eine Änderung des WerteNamens zudem viele Änderungen in verschiedenen Datein benötigte.
Die wird mit einer direkten Funktion umgangen indem man ggf dieser nur die neuen Funktion zuweist und markiert das man sie dann stück für stück aus dem Code erstzen kann.

mfg

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast