SQL Query sofort ausführen?

  • 0 x
    93 Beiträge
    0 Hilfreiche Beiträge
    11. 05. 2011, 15:15

    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?


  • 1
  • xandio xandio
    Padawan
    0 x
    40 Beiträge
    0 Hilfreiche Beiträge
    13. 05. 2011, 20:04

    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:

    1. $sql = "SELECT * FROM table";
    2. $query = $this->createQuery();
    3. $query->statement($sql);
    4. $result = $query->execute();
    5. $result->toArray(); // <--
    6. return $result;

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

    [url=http://odetocode.com/blogs/scott/archive/2008/10/01/lazy-linq-and-enumerable-objects.aspx]Ein ähnlicher Umstand erklärt für LINQ.[/url]

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

    Viele Grüße,
    Xandi

  • Philipp88 Philipp88
    Sternenflotten-Admiral
    0 x
    199 Beiträge
    0 Hilfreiche Beiträge
    20. 02. 2013, 20:59

    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 kainobi
    Jedi-Ritter
    0 x
    141 Beiträge
    0 Hilfreiche Beiträge
    21. 02. 2013, 08:53

    [quote="Philipp88"]
    Wie ich es verstanden habe, wird die Query erst ausgeführt wenn das im Template mittels view->assign gebraucht wird. [/quote]
    Nicht ganz, die Query wird ausgeführt sobald Du das erste mal lesend auf das QueryResult zugreifst.

    [quote="Philipp88"]
    Wie kann ich aber z.b. die gesamte Anzahl der Rows ausgeben lassen
    [/quote]
    <f:count>{items}</f:count>

    [quote="Philipp88"]
    Ist das auch möglich bzw. für TYPO3 nicht besser, die $SQL mittels "$GLOBALS["TYPO3_DB"]->SELECTquery(...)" zu definieren?
    [/quote]
    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).

  • 1