Zum Inhalt springen

SQL Query sofort ausführen?

Erstellt am 11. Mai 2011 · 3 Antworten · letzte Antwort am 21. Februar 2013

Tags: Frage

skriptkiddie ·

Hallo Zusammen,

ich rufe aus meinem Controller aus eine Funktion im Repository auf die ein Datenbankquery ausführt:

$sql = "SELECT * FROM database";
$query = $this->createQuery();
$query->statement($sql);
return $query->execute();

Das Query wird erst ausgeführt, nach dem ich per view-assing das Template aufgerufen habe und darin wiederum das Objekt.
Aber warum? Warum kann das Statement nicht gleich ausgeführt werden?

xandio ·

Hallo skriptkiddie!

Eine Query wird in Extbase erst ausgeführt, wenn ihr Ergebnis verwendet wird.

Man kann die unmittelbare Ausführung allerdings erzwingen, indem man z.B. "$result->toArray();" nach dem execute() einfügt. Du solltest jedoch Gründe für eine derartige Vorgangsweise haben. ;-)

"$result->count()" hat offenbar keinen derartigen Effekt.

Beispiel:

$sql = "SELECT * FROM table";
$query = $this->createQuery();
$query->statement($sql);
$result = $query->execute();
$result->toArray();  // <--
return $result;

Folgender Kommentar findet sich bei der Klasse Tx_Extbase_Persistence_QueryResult: "A lazy result list that is returned by Query::execute()"

Ein ähnlicher Umstand erklärt für LINQ.

Leider habe ich keine diesbezügliche Dokumentation für FLOW3/Extbase gefunden.

Viele Grüße,
Xandi

Philipp88 ·

Hi,

ich bin auch gerade dabei mich in Extbase einzuarbeiten. Wie ich es verstanden habe, wird die Query erst ausgeführt wenn das im Template mittels view->assign gebraucht wird. Wie kann ich aber z.b. die gesamte Anzahl der Rows ausgeben lassen (um z.b. eine Seitennavigation zu generieren bzw. die Anzahl der Ergebnisse ausgeben zu lassen)?

Ist das auch möglich bzw. für TYPO3 nicht besser, die $SQL mittels "$GLOBALS["TYPO3_DB"]->SELECTquery(...)" zu definieren?

Danke im Vorraus
Philipp

kainobi ·
Philipp88 schrieb

Wie ich es verstanden habe, wird die Query erst ausgeführt wenn das im Template mittels view->assign gebraucht wird.

Nicht ganz, die Query wird ausgeführt sobald Du das erste mal lesend auf das QueryResult zugreifst.

Philipp88 schrieb

Wie kann ich aber z.b. die gesamte Anzahl der Rows ausgeben lassen

<f:count>{items}</f:count>

Philipp88 schrieb

Ist das auch möglich bzw. für TYPO3 nicht besser, die $SQL mittels "$GLOBALS["TYPO3_DB"]->SELECTquery(...)" zu definieren?

Innerhalb Extbase auf gar keinen Fall! Du willst ja normalerweise dass Dir die Query die fertig gemappten Domain Models zurückliefert, mit $GLOBALS["TYPO3_DB"] müsstest Du das alles selber machen. Weiters wird durch das Kapseln in ein QueryResult Objekt erst mal ermöglicht, dass man auf einfache Art die Original-Query in der View modifizieren kann (z.B. für das Pagination Widget).