2009-01-15 9 views
10

Bei einer DBIx :: Class resultset, zum Beispiel:Was ist die richtige Methode zum Anzeigen eines DBIx :: Class ResultSet in meinem Catalyst-Projekt, das Template Toolkit verwendet?

my $rs = $c->model("DB::Card")->search({family_name => "Smith"}); 

die Tutorials ich das Versteck benutzen gelesen habe eine ArrayRef der Zeilen weitergeben müssen:

$c->stash->{cards} = [$rs->all]; 

Dies führt zu der Abfrage ausgeführt zu werden an dieser Stelle, und die resultierenden Gegenstände in das Versteck gestopft, damit sie in Template-Toolkit eingesetzt werden als:

[% FOREACH card IN cards %] 
    [% card.given_name %] [% card.family_name %] 
[%END%] 

gibt es eine richtige Art und Weise Iterierte hat TT über die Reihen, wie sie aus der DB geholt werden?

Antwort

19

Sicher. Sie können das Resultset direkt an TT übergeben und in der Vorlage darüber iterieren.

$c->stash->{cards} = $rs; 

... und dann:

[% WHILE (card = cards.next) %] 
    [% card.given_name %] [% card.family_name %] 
[% END %] 
5

Oder, noch besser:

$c->stash(cards => $rs); 

... in TT-Vorlage:

[% FOREACH card = cards %] 
    [% card.given_name %] [% card.family_name %] 
[% END %] 
+2

Funktioniert das? - FOREACH nimmt ein Array, kein Recordset, nein? – Thelema

+0

Ich habe viel gekämpft, aber [% FOREACH foo IN foos%] benutzt, aber ich sehe, dass [% FOREACH foo = foos%] gut funktioniert;) – nicomen

2

ich tun:

@{$c->stash->{cards}} = $rs->all; 

In der Vorlage:

[% FOREACH card IN cards %] 
    [% card.given_name %] [% card.family_name %] 
[% END %] 
+0

Speicher hungrig mit einem großen Resultset. – singingfish

+0

Ja, dies wird als Beispielcode angegeben, ist aber nicht sehr effizient – Thelema

2

ich tat genau das Gleiche wie der Autor.

Beim Versuch, einen strengeren MVC-Ansatz zu erstellen, verarbeite ich jetzt die DBIC-Objekte im Controller und übergebe einen sehr einfachen Stash, damit die Vorlage angezeigt wird. (Der Hauptvorteil ist, dass der Code von anderen Skripts anstelle der Webschnittstelle wiederverwendet werden kann.)

Ich bin neugierig, ob jemand weiß, ob dies effizienter ist oder nicht, Verarbeitung oder Speicher. Ich würde denken, dass die erste Methode zu weniger Verarbeitungszeit, aber zu längerem Speicher führt. Ich vermute, dass mein neuer Ansatz ein wenig mehr Verarbeitung und etwas mehr Speicher benötigt, aber das potenziell große Ergebnismengenobjekt nicht so lange lebt.