[Frage] mm-Tabellen-Werte auslesen

  • McGregor McGregor
    Jedi-Ratsmitglied
    0 x
    610 Beiträge
    0 Hilfreiche Beiträge
    01. 07. 2015, 16:47

    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:

    1. namespace pluginname\pluginname\Domain\Repository;
    2. class HausRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
    3. public function findeLaender() {
    4. $query = 'SELECT * FROM tx_pluginname_domain_model_land WHERE deleted = 0 AND hidden = 0';
    5. $q = $this->createQuery();
    6. $q->statement($query);
    7. $antwort = $q->execute();
    8. \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($q);
    9. return $antwort;
    10. }
    11. }

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

    1. Extbase Variable Dump
    2. TYPO3\CMS\Extbase\Persistence\Generic\Queryprototypeobject
    3. type => 'pluginname\pluginname\Domain\Model\Haus' (47 chars)
    4. objectManager => TYPO3\CMS\Extbase\Object\ObjectManagersingletonobjectfiltered
    5. dataMapper => TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMappersingletonobjectfiltered
    6. persistenceManager => TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManagersingletonobjectfiltered
    7. qomFactory => TYPO3\CMS\Extbase\Persistence\Generic\Qom\QueryObjectModelFactorysingletonobjectfiltered
    8. source => NULL
    9. constraint => NULL
    10. statement => TYPO3\CMS\Extbase\Persistence\Generic\Qom\Statementprototypeobject
    11. statement => 'SELECT * FROM tx_pluginname_domain_model_land WHERE deleted = 0 AND hidden
    12. = 0' (79 chars)
    13. boundVariables => array(empty)
    14. orderings => array(empty)
    15. limit => NULL
    16. offset => NULL
    17. querySettings => TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettingsprototypeobject

    Das Array sieht folgendermaßen aus:

    1. TYPO3\CMS\Extbase\Persistence\Generic\QueryResultprototypeobject (3 items)
    2. 0 => pluginname\pluginname\Domain\Model\Hausprototypepersistent entity (uid=1, pid=21)
    3. uid => 1 (integer)
    4. name => 'Schweden' (8 chars)
    5. description => '' (0 chars)
    6. sterne => 0 (double)
    7. abpreis => 0 (double)
    8. kategorie => 0 (integer)
    9. wohnflaeche => 0 (integer)
    10. belegung => '' (0 chars)
    11. gewaesser => NULL
    12. region => NULL
    13. arten => NULL
    14. _localizedUid => 1 (integer)modified
    15. _languageUid => 0 (integer)modified
    16. _versionedUid => 1 (integer)modified
    17. pid => 21 (integer)
    18. 1 => pluginname\pluginname\Domain\Model\Hausprototypepersistent entity (uid=2, pid=21)
    19. 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:
    [code]- Schweden
    - Norwegen
    - See
    - Fluß
    [/code]

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

    Vielen Dank
    Jens

  • Hilfreichster Beitrag

  • toifel toifel
    Jedi-Ratsmitglied
    1 x
    831 Beiträge
    96 Hilfreiche Beiträge
    02. 07. 2015, 10:26 - Hilfreichster Beitrag

    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."


  • 1
  • toifel toifel
    Jedi-Ratsmitglied
    1 x
    831 Beiträge
    96 Hilfreiche Beiträge
    02. 07. 2015, 10:26

    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 McGregor
    Jedi-Ratsmitglied
    0 x
    610 Beiträge
    0 Hilfreiche Beiträge
    03. 07. 2015, 09:39

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

    1. <?php
    2. namespace pluginname\pluginname\Domain\Repository;
    3. class LandRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
    4. public function findAll() {
    5. return $this->createQuery()->execute();
    6. }
    7. }

    Danke

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    03. 07. 2015, 10:45

    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.

  • 1