[TYPO3-german] Extbase -> verschachtelte m:m-Abfrage im Repository fomulieren?

Robert Wildling rowild at gmx.net
Sun Aug 4 07:41:37 CEST 2013


Danke, Eike, für deine ausführliche Antwort!!!

Das mit den Arrays wird wahrscheinlich die Lösung sein! (Jetzt weiß ich 
auch endlich, was das setReturnRawQueryResult bedeutet!)
Kannst du mir noch einen Denkanstoß geben, wie danach das Ergebnis 
wieder als Objekt gebaut werden soll?

Verständnis-Frage zur Lösung mit neuer Repository-Function:
Derzeit wird alles durch die Funktion findAll() ausgeworfen, und 
innerhalb dieser gibt es eben diesen Punkt, wo dieser Spezialfall mit 
den Konzert-UA kalkuliert werden soll. Mir ist nicht klar, wir ich aus 
dieser findAll()-Methode an genau dieser Stelle die neue Funktion im 
Repository aufrufen soll. Geht das denn überhaupt? Aus einer 
Reposiotry-Funktion eine andere aufrufen?

Nochmals danke und schönen Sommer noch!
Beste Grüße, Robert

> Hallo Robert,
>
> Ok verstehe.
>
> Da gibt es mehrere Möglichkeiten, so spontan fallen mir 3. ein:
>
> 1. Eigenes SQL Schreiben via statemant:
> $query->statement('JOINS über 2 Tabellen')
> Hat allerdings den Nachteil, das du nicht mehr FLOW kompatibel bist.
>
> 2. Du lässt dir das Ergebnis im Repository als Array zurück geben:
> $query->getQuerySettings()->setReturnRawQueryResult( TRUE );
> Dann kannst du im Repository alle Sortierungen/Gruppierungen mit PHP
> vornehmen. Danach am besten wieder zu Objekten machen.
>
> 3. Eine Funktion im Reopository bauen:
>
> PSEUDO:
> findAllUAByKonzerts(\TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Rowild\Kofomi\Domain\Model\Concerts>
> Konzerts){
> }
>
>
> Diese liefert zu einer menge an Konzerten alle UAs
> Dies wird im Controller dann so aufgerufen:
> PSEUDO:
> foreach ($concerts findAllConcerts() as $concert){
> 	$ua[]=findAllUAByKonzerts($event->getConcerts());
> 	//Doppelte rauschmeissen nicht vergessen.
> }
>
>
> Von Haus aus glaube ich kann Extbase das nicht.
>
>
> Bis denne, Eike
>
>
>
>
> Am 01.08.2013 22:43, schrieb Robert Wildling:
>> Hallo, Eike,
>>
>> Danke für deine Antwort!
>>
>> So, wie du es beschreibst, funktioniert es auch ganz wunderbar. Diese
>> Art von Ausgabe setze ich auch derzeit ein, sie hat nur den "Nachteil",
>> dass die UA immer unter dem jeweiligen Konzert ausgegeben werden:
>>
>> - Event
>> -- Konzert 1
>> --- UA 1
>> --- UA 2
>> -- Konzert 2
>> --- UA 3 (oder eigentlich wieder 1)
>> --- UA 4 (...ditto...)
>> [etc]
>>
>> Ich will aber die UA *aller* Konzerte zusammenfassen und als eigenen
>> Punkt unter Events ausgeben (als etwas Spezielles dieses Events sozusagen):
>>
>> - Event
>> -- Alle UAs dieses Events (4):
>> --- UA 1
>> --- UA 2
>> --- UA 3
>> --- UA 4
>> -- Konzert 1
>> -- Konzert 2
>>
>> Und gezählt sollten sie auch nocht werden! :-)
>>
>> Sorry, das hab ich beim ersten Post so nicht erwähnt!
>>
>> Ich könnte (und hab auch schon) natürlich unter Events ein Feld UA
>> anlegen und dort die UA-Werke separat zuteilen. Das hat dann aber zur
>> Folge, dass
>> 1. Redundanz anfällt, denn bei den Konzerten müssen diese UAs auch
>> angegeben werden
>> 2. eine gewissen Fehleranfälligkeit eintreten kann, weil es keine
>> Kontrollstrukturen gibt, die checken, ob die UAs dieses Events auch alle
>> in den Konzerten vorhanden sind.
>>
>> Bedingt geht das mit Fluid, aber es scheint mir jene Art von zuviel
>> Programmierlogik zu sein, wo man dann sagt, das sollte eher in einem
>> Repository abgehandelt werden...
>>
>> Oder fällt dir dazu etwas ein?
>>
>> Danke nochmals!
>> Grüße und schönen Abend!
>> Robert
>>
>>
>>> Hi,
>>> warum willst Du das überhaupt so machen?
>>>
>>> Ich verstehe das so:
>>> Event<-M:M->Konzerte<-M:M->Werke
>>>
>>> In Fluid kannst du dich dich einfach über diese Relationen bewegen:
>>> Event.Konzerte.Werke.
>>>
>>> Gut ok da es alles MM verknüfpungen sind muss du natürlich schleifen
>>> bauen
>>>
>>> Pseudo:
>>>
>>> foreach Events as Event
>>>      forach Event.Konzerte as Konzert
>>>          foreach Konzert.Werke as Werk
>>>              {Wker}
>>>          done
>>>      done
>>> done
>>>
>>> Oder verstehe ich nicht was Du willst.
>>>
>>>
>>> Bis denne, Eike
>>>
>>>
>>> On 01.08.2013 10:42, Robert Wildling wrote:
>>>> Hi, Extbase-Spezis,
>>>>
>>>> Kann mir jemand bitte einen Tipp bei folgendem Problem geben?
>>>> Wieder mal eine Event-Extension...
>>>>
>>>> Ein Event kann mehere Konzerte haben, und jedes dieser Konzerte kann
>>>> Werke am Programm haben, die Uraufführungen sind - diese gilt es, von
>>>> "Event" aus zu finden und als kleine Liste darzustellen - und zwar auf
>>>> allen möglichen Konzerten.
>>>>
>>>> Event, Konzerte und Werke sind alles eigene vollständige Objekte, die
>>>> über m:m Relationen miteinander verknüpft werden.
>>>>
>>>> in Event gibt es dazu ein Listenfeld "concerts", das per Klick gefüllt
>>>> wird, und in Konzerte wiederum gibt es ein Feld "Premieres", das per
>>>> klick Werke einfügt.
>>>>
>>>> Die erste m:m-Relation wird ja von Extbase selbst ganz fein gehandelt,
>>>> aber wie geht man die nächste Ebene an m:m-Relation an?
>>>>
>>>> Derzeit versuche ich mich an diesem da, komm aber nicht weiter, weil ich
>>>> nicht weiß, wie ich die "Premieres" ins Spiel bringen soll:
>>>>
>>>>
>>>> /**
>>>>        * Find all concerts and within them all premieres. Group them in a
>>>> list (alphabetically?)
>>>>        *
>>>>        * @param
>>>> \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Rowild\Kofomi\Domain\Model\EventGroups>
>>>>
>>>> $eventGroup
>>>>        * // ist das der richtige return Type???
>>>>        * @return
>>>> \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Rowild\Kofomi\Domain\Model\Concerts>
>>>>
>>>> $premieres
>>>>        */
>>>>       public function findConcertPremieres($eventGroup) {
>>>>           $query = $this->createQuery();
>>>>           // Muss da irgendwo ein "groupBy" sein...???
>>>>           $query->matching(
>>>>               $query->logicalAnd(
>>>>                   $query->contains('eventGroup', $eventGroup),
>>>>                   $query->matching(
>>>>                       $query->greaterThan('premieres', 0); // <= geht
>>>> das??? weil m:m?
>>>>                   )
>>>>               );
>>>>           );
>>>>           // wie nach dem Titel der Werke, die UAs sind, ordnen?
>>>>           $query->setOrderings(
>>>>               array (
>>>>                   'premieres.title' =>
>>>> \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING,
>>>>               )
>>>>           );
>>>>           return $query->execute();
>>>>       }
>>>>
>>>> (Es gibt übrigens mehrere Event-Typen, deswegen die eventGroup...)
>>>>
>>>> Das nächste Problem ist: ich kann den Code nicht auf seine
>>>> Funktionalität prüfen, weil ich nicht weiß, wie ich diese Spezielle
>>>> Abfrage aus Fluid aufrufe...
>>>>
>>>> Ich bitte um Hilfe - danke!
>>>> Schöne Grüße,
>>>> Robert
>>>>
>>>>
>>>> _______________________________________________
>>>> TYPO3-german mailing list
>>>> TYPO3-german at lists.typo3.org
>>>> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
>>>
>> _______________________________________________
>> TYPO3-german mailing list
>> TYPO3-german at lists.typo3.org
>> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german



More information about the TYPO3-german mailing list