GORM für Einsteiger

Hier finden sich Fragen und Ergänzung zur Dokumentation. // All questions and discussions about the documentation.
Antworten
Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: GORM für Einsteiger

Beitrag von ma2604121 » 06.09.2011, 12:23:13

Das Tutorial im Wiki ist angepasst.

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

Re: GORM für Einsteiger

Beitrag von dr.e. » 06.09.2011, 14:19:52

Vielen Dank für deine Arbeit! Super Tutorial.
Viele Grüße,
Christian

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: GORM für Einsteiger

Beitrag von ma2604121 » 21.09.2011, 14:58:06

Ich würde gerne einen Validator erstellen, der mir überprüft, ob ein Datensatz bereits vorhanden ist. Gibt es eine einfache Möglichkeit, mittels GORM nachzuprüfen, ob ein Eintrag bereits existiert?

Meine erste Idee wäre wie folgt:

Code: Alles auswählen

class test extends TextFieldValidator{
    public function validate($Title){
    $orm = $this->getMapper();
    $select = 'SELECT `Title` FROM ent_books WHERE ´Title´ = \''. $Title .'\' LIMIT 1';
    $Book = $orm->loadObjectByTextStatement('Books', $select);
    // Leeres Resultat => return false, Befülltes Resultat => return true
    }

    private function getMapper(){
    $ormFact = &$this->getServiceObject('modules::genericormapper::data', 'GenericORMapperFactory');
    return $ormFact->getGenericORMapper('modules::genericormapper', 'test', 'test');
    }
}
 
Ich vermute jedoch, dass es komfortabler zu lösen ist...

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: GORM für Einsteiger

Beitrag von Screeze » 21.09.2011, 15:39:34

Sofern dein $Title nicht vorher escaped wird, hast du hier sowieso eine SQL-Injection gebastelt.

Eine Alternative wäre die API des GORM mit dem Criterion zu verwenden, dort werden die Inputs dann automatisch escaped:
(quick'n'dirty ungetestet)

Code: Alles auswählen


public function validate($Title){
    $orm = $this->getMapper();
    $crit = new GenericCriterionObject();
    $crit
        ->addCountIndicator(1)
        ->addPropertyIndicator('Title', $Title);
    return ($orm->loadObjectCount('Books', $crit) === 0) ? false : true
}
 

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: GORM für Einsteiger

Beitrag von dave » 21.09.2011, 15:43:52

Ahh, Screeze war schneller ^^

Ja, es geht schöner mit einem GenericCriterionObject ;)

Code: Alles auswählen

public function validate($Title) {
  $orm = $this->getMapper();
  $crit = new GenericCriterionObject();
  $crit->addpropertyIndicator('Title', $Title);
  return $orm->loadObjectListByCriterion('Books', $crit);
} 
Ungetestet!

Damit werden dir alle passenden Datensätze zurück gegeben. Oder Null wenn es keinen gibt. Es gibt eben mehrere Möglichkeiten. Meine Variante kannst du später auch dahingehend verwenden, alle Einträge auszugeben. Mit Screeze' Variante prüfst du eben nur, ob es da schon was gibt oder nicht.

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: GORM für Einsteiger

Beitrag von ma2604121 » 21.09.2011, 15:53:09

Schon mal vielen Dank!

Also der GORM ist eine feine Sache - da kann es keine Zweifel geben. Allerdings bin ich noch nicht ganz "durchgestiegen", was manches angeht, daher eine ergänzende Frage:

Wenn ich nun noch eine Einschränkung hinsichtlich eines bestimmten Autors haben möchte, wie muss ich das einbauen? Derzeit wird ja schlicht und einfach überprüft, ob ein bestimmter Titel vorhanden ist.

Wenn aber nun folgendes eintritt: Autor A hat den Titel "T" geschrieben, Autor B hat ebenfalls ein Buch mit dem Titel "T" geschrieben. Das Buch von Autor A ist bereits erfasst, folglich würde meine Prüfung "meckern", weil der Titel bereits vorhanden ist. In diesem Fall müsste also eine Ergänzung rein, die den Autor berücksichtigt.

Da habe ich derzeit noch etwas Probleme hinsichtlich einer einfachen Lösung (da schließlich noch die Verknüpfung zwischen Autoren und Buch hergestellt werden muss).

Ich vermute, dass das wieder mittels loadRelatedObjects() geschehen muss?

APFelsahne
Beiträge: 222
Registriert: 18.03.2010, 13:13:07
Wohnort: Ludwigshafen am Rhein
Kontaktdaten:

Re: GORM für Einsteiger

Beitrag von APFelsahne » 21.09.2011, 16:05:10

ich glaub das funzt über

Code: Alles auswählen

$Autor = new GenericCriterionObject('Autor'); // --- Besser aus Datenbank lesen, z.b. Autor A laden
$crit->addpropertyIndicator('Title', $Title)->addRelationIndicator('Autor',$Autor);
habs aber bisher noch nich probiert gehabt.
Grüße, Florian
BildAPF-Extension wsCatalyst

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: GORM für Einsteiger

Beitrag von Screeze » 21.09.2011, 16:06:57

Kommt drauf an wie du deine Autoren managest, wenn die Autoren ein eigenes Objekt sind welche eine Beziehung zu den Book-Objekten haben, dann ist entweder die Lösung erst den Autor zu laden, und von diesem ausgehend mit loadRelatedObjects zu arbeiten (z.B. $Author->loadRelatedObjects('Author2Books', $crit);) oder mit der Criterion-Methode "$crit->addRelationIndicator('Author2Books', $Author);" und dann wie oben auch mit dem orm.

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: GORM für Einsteiger

Beitrag von ma2604121 » 21.09.2011, 16:24:54

Die Autoren sind mehr oder weniger die Benutzer des UMGT. Diese stehen in einer Verbindung User2Books.

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: GORM für Einsteiger

Beitrag von Megger » 21.09.2011, 16:31:51

Dann kannst du das auch per Criterion Object lösen

Code: Alles auswählen

$crit = new GenericCriterionObject();
$crit->addPropertyIndicator('Title', 'T');
$crit->addRelationIndicator('User2Books', $autorA);

$bookList = $orm->loadObjectListByCriterion('Book', $crit);
 
Dadurch hast du eine Liste von Büchern mit dem Titel 'T', die gleichzeitig mit $autorA verknüpft sind
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: GORM für Einsteiger

Beitrag von ma2604121 » 21.09.2011, 16:36:32

Das hatte ich probiert und erhielt folgenden Fehler:

Code: Alles auswählen

Argument 2 passed to GenericCriterionObject::addRelationIndicator() must implement interface GenericORMapperDataObject, string given, called in /var/www/beta/apps/rl/pres/validator/DoubleBooks.php on line 12 and defined 

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: GORM für Einsteiger

Beitrag von ma2604121 » 21.09.2011, 16:56:41

Da ich kein Ergebnis bekomme bzw. immer die Meldung, dass der Eintrag bereits vorhanden ist, mache ich wohl irgendetwas falsch.

Code: Alles auswählen

    public function validate($Title){
    $orm = $this->getMapper();
    $Author = new GenericDomainObject('Author');
    $Author->setObjectId(1);

    $Crit = new GenericCriterionObject();
    $Crit->addRelationIndicator('Author2Books', $Author)->addCountIndicator(1)->addPropertyIndicator('Title', $Title);

    return ($orm->loadObjectCount('Books',$Crit) === 0) ? true : false;
    } 
Der Eintrag ist auch vorhanden, allerdings für einen anderen Autor (ID 2). Dennoch erhalte ich immer die Meldung, dass das Buch bereits erfasst ist.

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: GORM für Einsteiger

Beitrag von Megger » 21.09.2011, 17:00:37

Du könntest das Debugging beim GORM anschalten (wenn du den GORM per Factory beziehst, dann kannst du das direkt bei der getGenericORMapper Methode machen, indem du als letzten Parameter noch true anhängst.

Dadurch erhälst du ein mysql log im logs Ordner, dort siehst du dann die SQL Statements die an die Datenbank geschickt werden
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: GORM für Einsteiger

Beitrag von ma2604121 » 21.09.2011, 17:07:55

Da scheint der komplette Teil zu fehlen, welcher auf den jeweiligen Autor einschränkt:

Code: Alles auswählen

SELECT COUNT(`BooksID`) AS objectcount FROM `ent_books` WHERE `ent_books`.`Title` = 'test1' 

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: GORM für Einsteiger

Beitrag von Megger » 21.09.2011, 17:20:56

Ah ok, ich sehe gerade, dass loadObjectCount die RelationIndicators gar nicht berücksichtigt, sondern nur die PropertyIndicators

Für die schnelle Hilfe kannst du dein return ein wenig umbauen

Code: Alles auswählen

return ($orm->loadObjectByCriterion('Books',$Crit) === null) ? true : false;
 
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast