4.8.12 Joins bei ItemCollections

Gesperrt
juedler
Beiträge: 12
Registriert: Di 17. Mär 2009, 11:30
Kontaktdaten:

4.8.12 Joins bei ItemCollections

Beitrag von juedler »

Hallo,

ich habe wieder mal ein Problem mit den Contenido Klassen.

Ausgangssituation:

Tabelle Kategorie, Lookup und Adressen. Lookup verknüpft über die IDs der Kategorien und Adressen beide miteinander.
Zu den Tabellen existieren jeweils Klassen, welche von Item und ItemCollection erben.

Mein Problem:
Ich benötige alle Adressen einer Kategorie sortiert nach einer Eigenschaft aus der Adressentabelle. Ohne diese Sortierung ist es kein Problem. Auch ein anschließendes Sortieren des unsortierten Ergebnisses wäre möglich. Ich möchte aber die Möglichkeit des verlinken, joinen mit der Methode link aus der Klasse ItemCollection nutzen. Dies ist auch bei include.frontend.left_top.php genutzt. Nur leider gelingt es mir nicht dies auf mein Zweck anzuwenden.

Ich hoffe, ich habe es ausreichend beschrieben und es gibt hier jemanden der dies schon mal erfolgreich angewendet hat und mir einen Tipp geben könnte.

Vielen Dank!
Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Re: 4.8.12 Joins bei ItemCollections

Beitrag von Dodger77 »

Ich würde sagen, so in der Art:

Code: Alles auswählen

/**
 * Linkende Klasse
 */
class LinkendeKlasseCollection extends ItemCollection {
	
	/**
	* Constructor Function
	* @param none
	*/
	function LinkendeKlasseCollection() {
		global $cfg;
		parent::ItemCollection($cfg["tab"]["linkendeklassetabelle"], "id");
		$this->_setItemClass("LinkendeKlasseItem");
	}

	/**
	* Tu was
	*/	
	function tuwas (array $typen) {

		$this->link("VerlinkteKlasseCollection");
		$this->addResultField("verlinkteklassecollection.name");
		$this->addResultField("verlinkteklassecollection.reihenfolge");

		$this->setWhere("verlinkteklassecollection.typ", $typen, "IN");

		$this->setOrder("verlinkteklassecollection.reihenfolge ASC");

		$this->query();
	}
}

/**
 * Verlinkte Klasse
 */
class VerlinkteKlasseCollection extends ItemCollection {
	
	/**
	* Constructor Function
	* @param none
	*/
	function VerlinkteKlasseCollection() {
		global $cfg;
		parent::ItemCollection($cfg["tab"]["verlinkteklassetabelle"], "ide");
		$this->_setJoinPartner("LinkendeKlasseCollection");
		$this->_setItemClass("VerlinkteKlasseItem");
	}

}
Die jeweiligen Item-Klassen muss man sich denken. Ist aber schon ein paar Tage her, dass ich mich mit der GenericDB herumgequält habe. :wink:

Es wäre ganz gut, wenn du dein Zwischenergebnis dann mal hier postest. Dann ist es evtl. etwas einfacher, dir da konkret zu helfen.
juedler
Beiträge: 12
Registriert: Di 17. Mär 2009, 11:30
Kontaktdaten:

Re: 4.8.12 Joins bei ItemCollections

Beitrag von juedler »

Hallo Dodger77,

soweit begriffen. Allerdings wenn ich dann das Ergebniss mir anschaue finde ich nicht das passende Ergebnis.

Ich habe deine tuwas mal erweitert:

Code: Alles auswählen

  function tuwas (array $typen) {

      $this->link("VerlinkteKlasseCollection");
      $this->addResultField("verlinkteklassecollection.name");
      $this->addResultField("verlinkteklassecollection.reihenfolge");

      $this->setWhere("verlinkteklassecollection.typ", $typen, "IN");

      $this->setOrder("verlinkteklassecollection.reihenfolge ASC");

      $this->query();
      while($oItem = $this->next()) {
           var_dump($oItem);
       }
   }
Leider finde ich im Ergebniss (also in den $oItems) keine Felder aus der anderen Tabelle. Muss ich das anders machen? Genauso konnte ich bisher keine Sortierung feststellen. Wie wird eigentlich der Join realisiert? Muss ich noch eine Verknüpfung der beiden Tabellen per WHERE Klausel einfügen, also Tab1.id = Tab2.id??

Wenn es richitg funktioniert werde ich meine Erkenntnisse ins Wiki eintragen.

Vielen Dank!
Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Re: 4.8.12 Joins bei ItemCollections

Beitrag von Dodger77 »

Wie schon geschrieben, mit konkretem Code ist das einfacher zu beurteilen.

Ansonsten kann ich nur den Rat geben nach dem Query mit:

Code: Alles auswählen

echo '<pre>' . $this->_lastSQL . '</pre>';
mal anzeigen zu lassen, was genau auf die Datenbank abgesetzt wird.

Probier auch mal statt

Code: Alles auswählen

while($oItem = $this->next()) {
           var_dump($oItem);
       }
folgendes

Code: Alles auswählen

if ($this->db->next_record()) {
           $oResult = $this->db->getResultObject();
           var_dump($oResult);
       }
und schau, was dabei heraus kommt.
Gesperrt