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

Robert Wildling rowild at gmx.net
Thu Aug 8 10:56:10 CEST 2013


Danke nochmals für deine Hilfe!
Wünsche noch einen schönen Sommer!
LG, Robert

> Hallo Robert,
>
> On 04.08.2013 07:41, Robert Wildling wrote:
>> Danke, Eike, für deine ausführliche Antwort!!!
> Gern geschehen.
>
>>
>> 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?
> Das geht so:
> foreach($resultArray as $result){
>     if ($this->identityMap->hasIdentifier($result['uid'], 
> $this->objectType)) {
> $object=$this->identityMap->getObjectByIdentifier($result['uid'],$this->objectType);
>             } else {
>                 $query = $this->createQuery();
> $query->getQuerySettings()->setRespectSysLanguage(FALSE);
> $query->getQuerySettings()->setRespectStoragePage(FALSE);
>                 $result = $query->matching($query->equals('uid', 
> $result['uid']))->execute();
>                 $object = NULL;
>                 if (count($result) > 0) {
>                     $object = $result->getFirst();
> $this->identityMap->registerObject($object, $uid);
>                 }
>             }
>             $objects[]=$object;
>         }
>         return $objects;
>
>>
>> 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?
>
> Ohne es selber schon mal gemacht zu haben würde ich aber sagen das das 
> gehen müsste. Spricht doch erst mal nichts dagegen.
>
> Du muss hat in deinem Repository das andere per dependency injection 
> bereit stellen:
> class PublicationRepository extends 
> \TYPO3\CMS\Extbase\Persistence\Repository {
>
> /**
> * someRepository
> *
> * @var \TYPO3\Publications\Domain\Repository\SomeRepository
> * @inject
> */
> protected $someRepository;
>
> public function findAll(){
>     something = $this->someRepository->findBySomething();
>     ....
> }
> }
>
> Bis denne, Eike
>>
>> 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
>>
>> _______________________________________________
>> 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