Zum Inhalt springen

mm-Tabellen-Werte auslesen

Erstellt am 1. Juli 2015 · 3 Antworten · letzte Antwort am 3. Juli 2015

Tags: Datenbank, Frage

McGregor ·

Hallo!

So langsam verstehe ich einige Dinge an dem extbase-Konstrukt. Aber einiges erschließt sich mir immer noch nicht.
Derzeit versuche ich alle Werte einer über mm-Tabelle referenzierten Tabelle aus zu lesen.
Daber verwende ich ein statement, da sonst wohl interne Mechanismen nicht greifen (ich hatte sowas mal gelesen).
Hier mal mein Repository:

namespace pluginname\pluginname\Domain\Repository;
class HausRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
	public function findeLaender() {
		$query = 'SELECT * FROM tx_pluginname_domain_model_land WHERE deleted = 0 AND hidden = 0';
		$q = $this->createQuery();
		$q->statement($query);
		$antwort = $q->execute();
		\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($q);
		return $antwort;		
	}
}

Das Ergebnis dieser Anfrage geht aber mit nichten an die entsprechende Datenbank (hier mal der Debug des Querys)

Extbase Variable Dump
TYPO3\CMS\Extbase\Persistence\Generic\Queryprototypeobject
   type => 'pluginname\pluginname\Domain\Model\Haus' (47 chars)
   objectManager => TYPO3\CMS\Extbase\Object\ObjectManagersingletonobjectfiltered
   dataMapper => TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMappersingletonobjectfiltered
   persistenceManager => TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManagersingletonobjectfiltered
   qomFactory => TYPO3\CMS\Extbase\Persistence\Generic\Qom\QueryObjectModelFactorysingletonobjectfiltered
   source => NULL
   constraint => NULL
   statement => TYPO3\CMS\Extbase\Persistence\Generic\Qom\Statementprototypeobject
      statement => 'SELECT * FROM tx_pluginname_domain_model_land WHERE deleted = 0 AND hidden 
         = 0' (79 chars)
      boundVariables => array(empty)
   orderings => array(empty)
   limit => NULL
   offset => NULL
   querySettings => TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettingsprototypeobject

Das Array sieht folgendermaßen aus:

TYPO3\CMS\Extbase\Persistence\Generic\QueryResultprototypeobject (3 items)
   0 => pluginname\pluginname\Domain\Model\Hausprototypepersistent entity (uid=1, pid=21)
      uid => 1 (integer)
      name => 'Schweden' (8 chars)
      description => '' (0 chars)
      sterne => 0 (double)
      abpreis => 0 (double)
      kategorie => 0 (integer)
      wohnflaeche => 0 (integer)
      belegung => '' (0 chars)
      gewaesser => NULL
      region => NULL
      arten => NULL
      _localizedUid => 1 (integer)modified
      _languageUid => 0 (integer)modified
      _versionedUid => 1 (integer)modified
      pid => 21 (integer)
   1 => pluginname\pluginname\Domain\Model\Hausprototypepersistent entity (uid=2, pid=21)
   2 => pluginname\pluginname\Domain\Model\Hausprototypepersistent entity (uid=6, pid=21)

Die Daten sind da, aber im falschen Model. Dies ist das Model des Hauses und nicht des Landes.
Was mache ich hier falsch? Wie benutze ich bei meiner Anfrage das korrekte Model?
Übrigens ist die Beziehung derzeit folgendermaßen:
Haus <=> mm_Haus_Region <=> Region <=> mm_Region_Land <=> Land

Zusätzlich führe ich noch 2 weitere ähnliche Anfragen an die Tabelle "Arten" und "gewaesser" aus.
(hier Haus <=> mm_Haus_Wasser <=> Wasser und Haus <=> mm_Haus_Arten <=> Arten)
Das Ergebnis ist ähnlich falsch, jedoch werden die ersten Datensätze der vorgehenden Anfragen nicht überschrieben.
So sieht das Array für gewaesser folgendermaßen aus:

- Schweden
- Norwegen
- See
- Fluß

Vielleicht hat ja jemand einen Holzhammer und trichtert mir das System ein?

Vielen Dank
Jens

toifel ·

Da du im HausRepository das statement baust geht Extbase davon aus, dass es auch ein "Haus" zurückgeben soll.
Wenn du ein Land-Objekt willst, dann brauchst du auch ein LandRepository.

Alternativ kannst du auch über ->getQuerySettings()->setReturnRawQueryResult(TRUE) ein normales Array ausgeben lassen:
"The method execute() per default returns a complete ready build object and the related objects - the complete Aggregate. In some cases it is convenient to preserve the "raw data" of the objects, e.g. if you want to manipulate them before you build objects out of them. For this you have to change the settings of the Query object."

McGregor ·

Wie geil. Natürlich. Wie dämlich von mir.
Mit einem neuen Repository flutscht das nun wunderbar.
Hier mal das einfache Rep:

<?php
namespace pluginname\pluginname\Domain\Repository;
class LandRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
	public function findAll() {
		return $this->createQuery()->execute();
	}
}

Danke

harald1972 ·

Hallo,

ich weiß nicht, was da nicht greifen soll oder was du gelesen hast...

da sonst wohl interne Mechanismen nicht greifen (ich hatte sowas mal gelesen).

...aber die MM-Tabellen sind doch genau dafür gemacht - und extbase auch darauf ausgelegt - solche Verknüpfungen sinnvoll abzuspeichern und auszulesen.

Solange du keine komplizierten JOINs abbilden musst (hierbei stößt du auf extabases Grenzen), musst du auch keine eigenen SQL-Statements abgeben. Diese bedeuten nämlich einen Methodenbruch.

Gruß
Harald

Edit: Jetzt ist dein eigener Post dazwischen geflutscht 😉
Na, so ist wenigstens kein hartgecodeter SQL-String drin.