[GORM] Objektliste laden

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

[GORM] Objektliste laden

Beitrag von Coach83 » 14.03.2013, 13:55:29

Hallo zusammen,

ich habe eine Frage zum GORM. Ich habe folgenden (vereinfachten) Aufbau meiner DB: ent_team und ent_article - jedes Team hat verschiedenen Artikel veröffentlicht und verwaltet diese. Jetzt möchte ich eine Funktion schreiben, die er mir ermöglicht, Artikellisten zu keinem Team (dann alle Artikel), zu einem Team (dann nur die Artikel dieses Teams) oder zu mehreren Teams aufzulisten.
Aufbau der Funktion sollte so in etwa aussehen.

Code: Alles auswählen

public function loadTeam2Article($TeamList = NULL) {
 $GCO1 = new GenericCriterionObject();
 if($TeamList){
    if(count($TeamList) == 1){ 

    }
    else{

    }
 }
 return $this->getORMapper()->loadObjectListByCriterion('Article', $GCO1);
}
Leider komme ich nicht voran.. kann mir da jemand helfen?

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

Re: [GORM] Objektliste laden

Beitrag von dr.e. » 14.03.2013, 14:25:47

Hallo Coach,

um ausgehend von einem Objekt andere in Beziehung stehende Objekte zu laden kannst du folgendes tun:

Code: Alles auswählen

// Alle Artikel eines Teams
$team = $orm->loadObjectById('Team', 1);
$articles = $orm->loadRelatedObjects($team, 'Article2Team');

// Alle Artikel
$allArticles = $orm->loadObjectList('Article');

// Alle Artikel von mehrere Teams
$crit = new GenericCriterionObject();
$crit->addRelationIndicator('Article2Team', $teamTwo);

$articles = $orm->loadRelatedObjects($teamOne, 'Article2Team', crit); 
Hoffe das hilft dir weiter.
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: [GORM] Objektliste laden

Beitrag von Coach83 » 14.03.2013, 14:42:04

ist es denn möglich, dass ich da noch weitere Teams einbinde? So würde das ja nur mit zweien funktionieren...
Hab es so probiert jetzt:

Code: Alles auswählen

public function getPagedArticleList($Start = '', $Limit = '', $Visibility = '', $PropertyField = '', $PropertyValue = '', $PropertyIndicator = '', $SortField = '', $SortOrder = '', $TeamList = NULL, $Text = false, $Category = NULL) {
        $crit = new GenericCriterionObject();
        if (count($TeamList) == 1) {
            $crit->addRelationIndicator('Article2Team', $TeamList);
        }
        if (count($TeamList) == 2) {
            $crit = new GenericCriterionObject();
            $crit->addRelationIndicator('Article2Team', $TeamList[1]);
        }
        if ($Category != NULL) {
            $crit->addRelationIndicator('ArticleCategory2Article', $Category);
        }
        if ($PropertyField != '' && $PropertyValue != '' && $PropertyIndicator != '') {
            $crit->addPropertyIndicator($PropertyField, $PropertyValue, $PropertyIndicator);
        }
        if ($Visibility != '') {
            $crit->addPropertyIndicator('Visibility', $Visibility);
        }
        if ($Text) {
            $crit->addPropertyIndicator('Text', '', '!=');
        }
        if ($SortField != '' && $SortOrder != '') {
            $crit->addOrderIndicator($SortField, $SortOrder);
        }
        if ($Start != '' && $Limit != '') {
            $crit->addCountIndicator($Start, $Limit);
        }
        
        if(count($TeamList) == 2){
            return $this->getORMapper()->loadRelatedObjects($TeamList[0], 'Article2Team', $crit);
        }
        
        return $this->getORMapper()->loadObjectListByCriterion('Article', $crit);
    }
Als Statement erhalte ich folgendes:
SELECT `ent_article`.* FROM `ent_article`
INNER JOIN `cmp_article2team` AS `e5ee64590de1fc00303cfc13dad67402_cmp_article2team` ON `ent_article`.`ArticleID` = `e5ee64590de1fc00303cfc13dad67402_cmp_article2team`.`Source_ArticleID`
INNER JOIN `ent_team` AS `4cf39739a5a1984541f52b3868dbb3f8_ent_team` ON `e5ee64590de1fc00303cfc13dad67402_cmp_article2team`.`Target_TeamID` = `4cf39739a5a1984541f52b3868dbb3f8_ent_team`.`TeamID`
INNER JOIN `cmp_article2team` AS `e5ee64590de1fc00303cfc13dad67402_cmp_article2team` ON `ent_article`.`ArticleID` = `e5ee64590de1fc00303cfc13dad67402_cmp_article2team`.`Source_ArticleID`
INNER JOIN `ent_team` AS `4cf39739a5a1984541f52b3868dbb3f8_ent_team` ON `e5ee64590de1fc00303cfc13dad67402_cmp_article2team`.`Target_TeamID` = `4cf39739a5a1984541f52b3868dbb3f8_ent_team`.`TeamID`
INNER JOIN `cmp_articlecategory2article` AS `03e59d8ddba50d88bca17ff6e857a288_cmp_articlecategory2article` ON `ent_article`.`ArticleID` = `03e59d8ddba50d88bca17ff6e857a288_cmp_articlecategory2article`.`Target_ArticleID`
INNER JOIN `ent_articlecategory` AS `bcc64304b972640043ab5ce1bb39abcb_ent_articlecategory` ON `03e59d8ddba50d88bca17ff6e857a288_cmp_articlecategory2article`.`Source_ArticleCategoryID` = `bcc64304b972640043ab5ce1bb39abcb_ent_articlecategory`.`ArticleCategoryID`
WHERE `4cf39739a5a1984541f52b3868dbb3f8_ent_team`.`TeamID` = 5
AND `bcc64304b972640043ab5ce1bb39abcb_ent_articlecategory`.`ArticleCategoryID` = 4
AND `ent_article`.`Visibility` = '1'
AND `ent_article`.`Text` != ''
AND `4cf39739a5a1984541f52b3868dbb3f8_ent_team`.`TeamID` = '3'
ORDER BY `ent_article`.`MatchDate` DESC LIMIT 0,20
Mit ner Fehlermeldung: Not unique table/alias: 'e5ee64590de1fc00303cfc13dad67402_cmp_article2team'

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

Re: [GORM] Objektliste laden

Beitrag von dr.e. » 15.03.2013, 00:14:37

Hallo Werner,

MySQL hat an dieser Stelle leider Recht, da dort ein
INNER JOIN `cmp_article2team` AS `e5ee64590de1fc00303cfc13dad67402_cmp_article2team`
2x vorkommt. Irgendwas mit dem GenericCriterionObject-Setup stimmt nicht. Versuche mal das Stück für Stück aufzubauen.
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: [GORM] Objektliste laden

Beitrag von Coach83 » 15.03.2013, 00:43:17

Naja.. mit nur einem Team hatte es so funktioniert:

Code: Alles auswählen

public function getPagedArticleList($Start = '', $Limit = '', $Visibility = '', $PropertyField = '', $PropertyValue = '', $PropertyIndicator = '', $SortField = '', $SortOrder = '', $Team = NULL, $Text = false, $Category = NULL) {
        $crit = new GenericCriterionObject();
        if ($Team != NULL) {
            $crit->addRelationIndicator('Article2Team', $Team);
        }
        if ($Category != NULL) {
            $crit->addRelationIndicator('ArticleCategory2Article', $Category);
        }
        if ($PropertyField != '' && $PropertyValue != '' && $PropertyIndicator != '') {
            $crit->addPropertyIndicator($PropertyField, $PropertyValue, $PropertyIndicator);
        }
        if ($Visibility != '') {
            $crit->addPropertyIndicator('Visibility', $Visibility);
        }
        if ($Text) {
            $crit->addPropertyIndicator('Text', '', '!=');
        }
        if ($SortField != '' && $SortOrder != '') {
            $crit->addOrderIndicator($SortField, $SortOrder);
        }
        if ($Start != '' && $Limit != '') {
            $crit->addCountIndicator($Start, $Limit);
        }
        return $this->getORMapper()->loadObjectListByCriterion('Article', $crit);
    }

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

Re: [GORM] Objektliste laden

Beitrag von dr.e. » 15.03.2013, 11:01:48

Hallo Coach,

ich hab heute Morgen angefangen, mir den Anwendungsfall lokal aufzubauen, bin allerdings noch nicht so weit gekommen, wie ich wollte. Melde mich wieder, sobald ich das genauer analysiert habe.
Viele Grüße,
Christian

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

Re: [GORM] Objektliste laden

Beitrag von dr.e. » 15.03.2013, 21:17:21

Hi Coach,

ich habe jetzt deine Abfrage im Kern nachgebaut und bei mir lokal kann ich den Fehler nicht reproduzieren. Meine Abfrage:

Code: Alles auswählen

$teamTwo = $orm->loadObjectByID('Team', 2);
$teamThree = $orm->loadObjectByID('Team', 3);

$category = $orm->loadObjectByID('Category', 1);

$crit = new GenericCriterionObject();
$crit->addRelationIndicator('Article2Team', $teamTwo);
$crit->addRelationIndicator('Article2Team', $teamThree);
$crit->addRelationIndicator('Article2Category', $category);

$articles = $orm->loadObjectListByCriterion('Article', $crit);
foreach($articles as $article){
   echo $article.'<br />';
} 
Ich fürchte ich brauche ein paar mehr Infos von dir um das wirklich zuverlässig nachstellen zu können. Kannst du mir dein Projekt inkl. Datenbank zippen und zur Verfügung stellen?
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: [GORM] Objektliste laden

Beitrag von Coach83 » 16.03.2013, 06:21:39

klar, ich erstelle es Dir morgen...

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

Re: [GORM] Objektliste laden

Beitrag von dr.e. » 22.03.2013, 23:03:15

Hallo Coach,

sorry, ich bin noch nicht dazu gekommen mir das Thema anzusehen. Versuche es morgen.
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: [GORM] Objektliste laden

Beitrag von Coach83 » 23.03.2013, 05:38:19

nur langsam... hab genug andere Themen ;-)

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: [GORM] Objektliste laden

Beitrag von Coach83 » 25.03.2013, 11:32:47

Moin,

ich stoße weiterhin auf das Problem:

Code: Alles auswählen

if ($Team) {
                  if (is_array($Team)) {
                        foreach ($Team AS $SingleTeam) {
                              $crit->addRelationIndicator('Article2Team', $SingleTeam);
                        }
                  } else {
                        $crit->addRelationIndicator('Article2Team', $Team);
                  }
            }
Wenn ich mir das $SingleTeam->getObjectId() ausgeben lassen, erhalte ich auch beide Id´s. Aber es wird trotzdem nur die Liste mit dem ersten Team geladen.

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

Re: [GORM] Objektliste laden

Beitrag von dr.e. » 25.03.2013, 20:11:19

Hallo Coach,

das liegt vermutlich an der Zeile

Code: Alles auswählen

$this->relations[$relationName] = $sourceObject; 
die in der Methode addRelationIndicator() aktuell nur eine Beziehung zu einem Objekt des selben Typs zulässt. :( Sofern du mehrere Teams als in Beziehung stehende Objekte darüber registrieren möchtest, gibt das der GORM aktuell nicht her. Wir können das Feature aber gerne auf die Roadmap setzen oder du baust es ein und ich übernehme das für das nächste Release.
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: [GORM] Objektliste laden

Beitrag von Coach83 » 26.03.2013, 17:49:27

Ich verstehe nicht genau, was ich da machen muss...

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: [GORM] Objektliste laden

Beitrag von Coach83 » 30.03.2013, 14:10:55

*push*
Wenn Du mir kurz beschreibst was ich machen soll, werde ich es versuchen...

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

Re: [GORM] Objektliste laden

Beitrag von dr.e. » 30.03.2013, 18:07:37

Hallo Coach,

die Methode addRelationIndicator() lässt aktuell nur eine Beziehung pro GCO pro Objekt-Typ zu (siehe GenericCriterionObject.php, Zeile 117ff). Um dies zu unterstützen muss diese Methode und zusätzlich im GORM das Zusammenbauen der Statements in der Methode buildJoinStatementsByCriterion() angepasst werden.

Auf die Roadmap setze ich das für dich, da musst du nichts weiter tun.

Beantwortet das deine Frage?
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast