[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