Wie beeinflusse ich das SQL mit DBIx::Class

Inhalt:

Es gibt SQL-Statements, die sich nicht von Haus aus mit DBIx::Class darstellen lassen; häufig ist der Grund, dass es kein Standard-SQL ist.

Beispiel FOUND_ROWS

Z.B. gibt es in MySQL? die Funktion FOUND_ROWS, die man aufrufen kann, nachdem man ein select mit SQL_CALC_FOUND_ROWS ausgeführt hat.

Ein gutes Beispiel für eine Anwendung ist eine Suche, deren Ergebnisse auf mehrere Seiten aufgeteilt werden soll. Man möchte gerne die Anzahl der Ergebnisse wissen und gleichzeitig die Ergebnisse haben. Statt 2 Statements (ein COUNT und das eigentliche select) kann man das in MySQL? zusammen ausführen.

SELECT SQL_CALC_FOUND_ROWS
  foo, bar
FROM baz
WHERE foo=23
LIMIT 0, 20

Das liefert 20 Ergebnisse. Nun folgt ein zweites Statement
SELECT FOUND_ROWS()
auf demselben db-Handle. Der Count wurde schon vorher ausgeführt, FOUND_ROWS liefert nur noch das Ergebnis dazu.

Mit DBIx::Class ist das mit einem kleinen Hack möglich:
my $search = $schema->resultset('Baz')->search(
  { foo => 23 },
  {
    select => [\'SQL_CALC_FOUND_ROWS foo', 'bar'],
    as     => [qw(foo bar)],
    rows   => 20,
    page   => 1,
  },
);
# zuerst ergebnisse holen, da erst beim ersten =next= das Statement ausgeführt wird
while (my $entry = $search->next) {
  # mach was mit $entry
}
my ($count) = $schema->source('Baz')->storage->dbh->selectrow_array("SELECT FOUND_ROWS()");

Ergänzungen, Kommentare

Kommentare werden am besten in folgender Form vorgenommen, damit sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff

UtilFaqSubForm edit

Titel Wie beeinflusse ich das SQL mit DBIx::Class
Autor TinaMueller
Bereich FaqDatenbanken
Tags DBIx::Class
Topic revision: r1 - 2007-05-26 - 00:40:00 - TinaMueller
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.