Zum Inhalt springen

m:n relation abfrage $query->matching($query->logicalAnd($constraints))

Erstellt am 5. Dezember 2014 · 2 Antworten · letzte Antwort am 6. Dezember 2014

Tags: Frage

npre ·

hallo,

ich stehe vor einem problem mit einer suchabfrage. ich habe eine extension mit einer m:n relation. es geht dabei um termine, die an mehreren tagen stattfinden. die jeweiligen tage sind als relation in einer eigenen tabelle. im suchformular kann man dann ein datum eingeben und als ergebnis sollten dann der terminname und das datum dazu ausgegeben werden.

funktionier soweit prima, nur dass ich bei der abfrage auch alle tage erhalte die zum termin gehören. beispiel:
der termin "fußball schauen" hat einen eintrag für 5. jänner, 7. feburar und 9. märz
der termin "kino gehen" hat einen eintrag für 7. jänner und 9 märz.

gebe ich nun in die suchmaske für datum von "1. jänner bis 20. jänner" ein kommen beide termin UND alle tage dazu. die liste sieht dann so aus:
- fußball schauen am 5. jänner, 7. feburar und 9. märz
- kino gehen am 7. jänner und 9 märz

gebe ich "2. bis 10. februar" ein kommt korrekter weise nur der termin fußball schauen" aber es spuckt mir auch wieder alle termine aus, d.h. der 5. jänner und der 9. märz sind auch dabei:
- fußball schauen am 5. jänner, 7. feburar und 9. märz

die datenbankabfrage sieht so aus:

 $constraints[] = $query->greaterThanOrEqual('termindaten.datumvon', $datumvons);	
		   $constraints[] = $query->lessThanOrEqual('termindaten.datumbis', $datumbiss);

$query->matching($query->logicalAnd($constraints))->setOrderings(array('sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING));
		   $terminKalenders = $query->execute();

meine logik sagt mir, dass bei der datenbankabfrage eigentlich nur der jeweilige termin vom dem gesuchten monat ausgegeben werden sollte. warum also gibt extbase trotzdem alle datum aus, auch wenn sie gar nicht in der größer als und kleiner als liegen?

bzw. wie kann ich die abfrage einstellen, dass nur der jeweilige termin mit dem 1 datum aus der suchabfrage kommt?

danke für eure hilfe

lg
npre

Unbekannter Benutzer ·

Moin npre,

also wenn ich dich richtig verstanden habe, haben deine Termine (z.B. "Fußball gucken" [Fußball gucken ist ein einzelnes eigenes Objekt?]) mehrere Tage zugewiesen?

Wenn du nun nach einem Termin ( und deine Termine sind so gesehen keine Tage... sondern Aktivitäten mit verschiedenen Daten ) suchst, und einen Tag als Filter übermittelst, werden alle Aktivitäten gefunden, die an deinem Suchfilter stattfinden.

Somit wird z.B. "Fußball gucken" gefunden, und dir zurückgegeben. Deine Aktivität Fußball gucken findet aber nun auch an 2 anderen tagen statt. Diese Verbindung besteht trotzdem zwischen deinem Fußball gucken und den einzelnen Tagen, die kannst du jetzt nicht einfach voneinander lösen.

Wenn dir aber nur der eine Termin angezeigt werden soll, musst du entweder einfach deine Ausgabe im Template anpassen, oder du reduzierst die Tage nach der Abfrage im Array auf die Tage, die du ausgeben möchtest. Andernfalls könntest du dein Domain Model anpassen. Denn rein "logisch" gesehen, sind Fußball gucken am 1.1. am 1.2 und am 1.3. drei verschiedene Termine, quasi nur mit dem selben Betreff. Das kennst du so eventuell aus deinem Google oder Outlook Kalender. Da kannst du auch einen sich wiederholenden Termin einstellen, aber für jedes einzelne Datum wird ein eigener Eintrag erstellt.

Ich hoffe das war verständlich und hat dir deine Frage/n irgendwie beantwortet 😉

npre ·

danke für die erklärung. ganz habe ich zwar nicht verstanden, warum ich meine "aktivität" fußball gucken nicht von den einzelnen tagen lösen kann. eine "normale" left join sql abfrage macht ja genau das. ich dachte, dass extbase durch die abfrage von mir auch sowas macht ... ich hab mir das mittlerweile mit einer manuellen datenbankabfrage und eben einem left join gelöst. das bringt genau mein gewünschtes ergebnis.