给定DBIx :: Class结果集,例如:
my $rs = $c->model("DB::Card")->search({family_name => "Smith"});
我读过的教程使用存储来传递行的arrayref:
$c->stash->{cards} = [$rs->all];
这导致查询在此时执行,并且生成的对象填充到存储中,因此它们可以在TemplateToolkit中用作:
[% FOREACH card IN cards %]
[% card.given_name %] [% card.family_name %]
[%END%]
是否有一种正确的方法让TT在从数据库中获取时对行进行迭代?
答案 0 :(得分:19)
不确定。您可以将结果集直接传递给TT并在模板中迭代它。
$c->stash->{cards} = $rs;
......然后:
[% WHILE (card = cards.next) %]
[% card.given_name %] [% card.family_name %]
[% END %]
答案 1 :(得分:5)
或者,甚至更好:
$c->stash(cards => $rs);
...在TT模板中:
[% FOREACH card = cards %]
[% card.given_name %] [% card.family_name %]
[% END %]
答案 2 :(得分:2)
我做:
@{$c->stash->{cards}} = $rs->all;
在模板中:
[% FOREACH card IN cards %]
[% card.given_name %] [% card.family_name %]
[% END %]
答案 3 :(得分:2)
我做的与作者完全一样。
在尝试创建更严格的MVC方法时,我现在正在处理控制器中的DBIC对象,并传递一个非常简单的存储区来显示模板。 (主要好处是代码可以被其他脚本重用,而不仅仅是Web界面。)
我很好奇是否有人知道这是否更有效,处理或内存方面。我认为第一种方法可以减少处理时间,但可以延长存储时间。我猜我的新方法需要更多的处理和更多的内存暂时,但潜在的大结果集对象不会持续很长时间。