• Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

"Geschachtelte" Mehrfach zu Mehrfach Beziehung.

StefanG

New member
Hallo,
da ich relativ neu im Zend Umfeld bin, habe ich vielleicht einfach falsch nach einer möglichen Antwort gesucht, da die Problemstellung relativ "Standard" ist, aber ich konnte einfach keine entsprechende Antwort, weder hier noch durch das Bemühen einer Suchmaschine finden.
Es geht darum, über eine "Beziehungstabelle" mit mehreren, nennen wir sie einfach mal "Tags", verknüpfte Zeilen auszulesen.

Als Beispiel:
Gesucht werden "Artikel".
Artikel können Beliebig viele "Tags" haben.
Die Verknüpfung steht in "ArtikelTags".

Ist Situation:
"ArtikelTags" hat entsprechende Referenz-Angaben ($_referenceMap). "Artikel" und "Tags" verweisen auf die "ArtikelTags" Tabelle ($_dependentTables). Das Abrufen aller Artikel zu einem Tag funktioniert durch die Verwendung von findManyToManyRowset für eine "Tags-Zeile".

Gesucht:
Ein Rowset aus "Artikel" mit mehreren "Tags".

Beispiel:
In "Tags" befinden sich folgende Zeilen: rot, blau, grün, groß, klein, dünn, trocken, feucht, klamm

Mit rot->findManyToManyRowset(...) finde ich alle Artikel die rot sind. Ich möchte allerdings z.B. alle Artikel erhalten die rot, klein und z.B. klamm sind.

Mit select wäre das für zwei Tags in etwa: select * from artikel, artikeltags A, artikeltags B where A.tag_name='rot' and A.artikel_id=artikel.id and B.tag_name='klein' and B.artikel_id=artikel.id

Und falls das nicht schon genug ist, hätte ich als Zusatzfrage: Wenn ich mit Zend_Db und Co. arbeite, dann gebe ich ja per default (also wenn ich mich z.B. an die Standard-Anleitungen halte) keine Einschränkungen an. D.h. zum Beispiel, dass ich für eine Artikelübersicht für jede Zeile ersteinmal alle Felder in den Speicher schreibe um danach dann z.B. nur 3 Felder zu verwenden. Macht das nicht unglaubliche Performance Einbußen, oder ist das Framework an dieser Stelle intelligenter als ich es grad vermute?

Vielen Dank für euer Ohr und viel mehr für eventuelle Hilfe.

Liebe Grüße

Stefan.
 

StefanG

New member
Es muss doch irgendwie möglich sein, eine SQL Standardsituation und wirklich eher triviale Aufgabe wie dieses Select, bzw. diesen pseudo-Code:

rot = tags->current();
yellow = tags->next();
artikelrowset = "select * from artikel, artikeltags A, artikeltags B where A.tag_id='rot->id' and A.artikel_id=artikel.id and B.tag_id='yellow->id' and B.artikel_id=artikel.id"
echo artikelRowset->current()->bezeichnung // rot-gelber artikel, der als rot und gelb getagt wurde.

in Zend "Logik" abzubilden... Ich habe bis jetzt versucht das gesamte Model meiner Anwendung mit Zend "Funktionalität" zu lösen und möglichst kein direktes SQL abzusetzen, um alles schön objektorientiert zu gestalten und jetzt einen Select abzusetzen wäre so schrecklich inkonsequent.
 

StefanG

New member
Ich habe es dann so gelöst. Ich hoffe es ist die halbwegs sinnvollste Lösung. Wenn jemanden etwas performanteres einfällt, oder ein Fehler auffällt bitte bescheid sagen (Achtung das ist nur pseudo code, der denn Sinn veranschaulichen soll, wichtig ist die Idee hinter dem select).

$red = $tagsRowset.current()
$yellow = $tagsRowset.next();

$artikelQuery = $artikelModel->select()
->setIntegrityCheck(false)
->from('artikel')
->join(array('a' => 'artikeltags'), 'a.artikel_id = artikel.id' )
->join(array('b' => 'artikeltags'), 'b.artikel_id = artikel.id')
->where('a.tag_id = ?', $yellow->id)
->where('b.tag_id = ?', $red->id)
->limit(10)
->order($orderStatement);
$this->view->artikel = $artikelModel->fetchAll($artikelQuery);

Liefert zumindest auf den ersten Blick korrekt alle Artikel die als rot und gelb getagt wurden.
 
Zuletzt bearbeitet:
Oben