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