在使用Template Toolkit的Catalyst项目中显示DBIx :: Class ResultSet的正确方法是什么?

时间:2009-01-15 15:59:28

标签: perl catalyst template-toolkit dbix-class

给定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 个答案:

答案 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界面。)

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