10

给定一个 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 在从数据库中获取行时对其进行迭代?

4

4 回答 4

19

当然。您可以将结果集直接传递给 TT 并在模板中对其进行迭代。

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

...进而:

[% WHILE (card = cards.next) %]
    [% card.given_name %] [% card.family_name %]
[% END %]
于 2009-01-15T16:17:53.043 回答
5

或者,甚至更好:

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

...在 TT 模板中:

[% FOREACH card = cards %]
    [% card.given_name %] [% card.family_name %]
[% END %]
于 2009-06-23T16:35:37.707 回答
2

我愿意:

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

在模板中:

[% FOREACH card IN cards %]
    [% card.given_name %] [% card.family_name %]
[% END %]
于 2009-08-12T22:23:50.120 回答
2

我在做和作者完全一样的事情。

在尝试创建更严格的 MVC 方法时,我现在正在控制器中处理 DBIC 对象并传递一个非常简单的存储以供模板显示。(主要好处是代码可以被其他脚本重用,而不仅仅是 Web 界面。)

我很好奇是否有人知道这是否更有效,处理或内存方面。我认为第一种方法可以减少处理时间,但可以延长内存。我猜我的新方法暂时需要更多的处理和更多的内存,但是潜在的大结果集对象不会活得那么久。

于 2010-03-30T16:27:02.133 回答