Zum Inhalt springen

Repository Abfragen verbinden

Erstellt am 8. Juni 2011 · 16 Antworten · letzte Antwort am 22. Juni 2011

Tags: Frage

zeitgenosse ·

Und warum nicht so?

$this->view->assign('comming', $this->exhibitionRepository->findUpcoming());
$this->view->assign('past', $this->exhibitionRepository->findPast());
jank ·

weil ich so doch im Template zusätzlich marker für vergangene Messen einfügen muss...

alle datensätze sollen nachher in die gleiche Tabelle, nur eben die verstrichenen zuletzt.

ich habe schon versucht im model einfach einen funktion getPast anlzulegen die mir zurückliefert ob schon verstrichen oder nicht... aber diese kann ich glaube ich nicht im repository für setOrderings ansprechen, oder?

zeitgenosse ·
jank schrieb

weil ich so doch im Template zusätzlich marker für vergangene Messen einfügen muss...

ja das ist so, aber ist das ein problem??? vielleicht verstehe ich auch nicht um was es genau geht?

<table>
<f:for each="{comming}" as="eventcomming">
<tr><td>eventcomming.value1</td><td>eventcomming.value2</td></tr>
</f:for>
<f:for each="{past}" as="eventpast">
<tr><td>eventpast.value1</td><td>eventpast.value2</td></tr>
</f:for>
</table>

alle datensätze sollen nachher in die gleiche Tabelle, nur eben die verstrichenen zuletzt.

ich habe schon versucht im model einfach einen funktion getPast anlzulegen die mir zurückliefert ob schon verstrichen oder nicht... aber diese kann ich glaube ich nicht im repository für setOrderings ansprechen, oder?

jank ·

Hallo zeitgenosse,
danke für den Tip.
Diese Lösung ist zwar eine Möglichkeit, aber gerade bei vielen values mit N:M Verknüpfungen usw. ist das nicht "schön" bei jeder Änderung gleich alles doppelt zu machen.
Deswegen wollte ich das eben über den controller oder im repository angehen und nicht im view.
Gibt es noch eine andere Möglichkeit die Ergebnisse von 2 querys zu verbinden?
Zurück kommen ja eigentlich 2 arrays oder verstehe ich das falsch?

jank ·

also ich habe das jetzt mal provisorisch so gelöst:
Im Controller

$upcoming = $this->exhibitionRepository->findUpcoming()->toArray();
$past = $this->exhibitionRepository->findPast()->toArray();
$exhibitions = array_merge($upcoming,$past);

dadurch entsteht aber der nachteil das widgets nicht mehr oder nur bedingt funktionieren.
deswegen setze ich das Thema noch nicht auf gelöst, vielleicht hat ja noch jemand eine gute Idee?!

Eydamos ·

Hi,

ich weiß zwar nicht wie deine Datenbank aussieht, aber wenn du ein Feld hast wo das Datum drin steht, dann kannst du doch eine einzelne Funktion im Repository machen und nach Datum sortieren lassen:

$query->setOrderings(array("datum"=>Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING));
jank ·

Über das Ordering ist das nicht zu lösen, denke ich.
Die Daten sollen 1. aufsteigend sortiert werden und 2. die schon vergangenen am Ende der Liste.

Ich dachte vielleicht, dass man dem Model eine Variable hinzufügt, welche nicht in die Datenbank geschrieben wird, nach der ich sortieren kann.

in die Richtung:

/**
 * past
 *
 * @var boolean
 */
protected $past = FALSE;

/**
 * @return boolean
 */
public function getPast() {
	if (dateTill < date(U)-86400) {
		$this->past = TRUE;
	}
	return $this->past;
}

und dann nach past sortieren (per Flexforms an und abschaltbar)... aber wie und wo?

Eydamos ·

Ich habe mir dein Beispiel nochmal angesehen und jetzt raff ich erst genau was du machen willst.

Ist auf jedenfall mit einem SQL Statement machbar.

Du hast zwei Möglichkeiten:
1. (schlechter aber einfacher):
du hast eine Spalte in deiner Datenbank in der z.B. eine 1 für vorbei und eine 0 für kommende einträge drin steht.
Dann machst du einfach zwei sortierungen, erst nach dem Feld und dann nach Datum.

$query->setOrderings(array(
"past"=>Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING,
"datum"=>Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING
));

2. (besser aber etwas schwieriger)
statt der Spalte lässt du die Datenbank das erledigen, wobei ich nicht sagen kann ob das so klappt ist in TYPO3 ungetestet in der Datenbank geht es auf jeden Fall:

$query->setOrderings(array(
"datum <= time()"=>Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING,
"datum"=>Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING
));

sonst musst du es halt mit $query->statement() machen.

Unbekannter Benutzer ·

Trotzdem noch der kleine Tipp, dass man im Template auch einfach mti einem Partial arbeiten könnte, du also zwei getrennte objects im Template verarbeitest aber die Ausgabe eigentlich dem Partial überlässt. Dadurch müssten dann Änderungen auch nur einmal gemacht werden.

<table>
<f:for each="{comming}" as="eventcomming">
<f:render partial="myEventPartial" />
</f:for>
<f:for each="{past}" as="eventpast">
<f:render partial="myEventPartial" />
</f:for>
</table>
jank ·

Dadurch geht auch die Möglichkeit verloren das paginate widget zu benutzen...

Kitsunet schrieb

...

<table>
<f:for each="{comming}" as="eventcomming">
<f:render partial="myEventPartial" />
</f:for>
<f:for each="{past}" as="eventpast">
<f:render partial="myEventPartial" />
</f:for>
</table>

...

jank ·

Hallo nochmal zusammen,
ich habe mittlerweile im Repository ein eigenes select statement, welches mir die Daten richtig sortiert und auch als QueryResult zurückgibt.

Nun habe ich aber ein seltsames Problem mit dem paginat widget.

Es kommt kein Fehler, aber es werden alle Resultate auf der ersten Seite angezeigt und zusätzlich werden die links zu den weiteren Seiten angezeigt (1 2 next). Jede Seite enthält alle Resultate...
muss man etwas beim query statement beachten, damit das paginate widgets funktionieren???