【问题标题】:DBIx::Class: sub resultset in Template Toolkit presented as an array, not a resultsetDBIx::Class:模板工具包中的子结果集显示为数组,而不是结果集
【发布时间】:2015-04-04 04:54:24
【问题描述】:

我正在使用 DBIx::Class 和 Template Toolkit 开发一个 Catalyst 应用程序;在我遇到问题的特定部分中,我通过在我的 ResultSet 架构中调用以下函数获得了一个结果集:

sub Divisions_and_teams_in_season { 我的 ($self, $season, $grid) = @_; 返回 $self->搜索({ "division_seasons.season" => $season->id, "division_seasons.fixtures_grid" => $grid->id, }, { 预取 => [ "division_seasons", { "team_seasons" => { “团队” => [{ “俱乐部” => “场地” }, “回家之夜” ] } } ], order_by => { -asc => [qw(division_seasons.rank team_seasons.grid_position club.short_name team.name)] } }); }

这会按我的预期返回数据,并且我可以在我的 Controller 代码中执行以下操作来取回我的结果集并遍历 team_seasons:

我的 $divisions = [ $c->model("DB::Division")->divisions_and_teams_in_season($current_season, $c->stash->{grid}) ]; foreach 我的 $division (@{ $divisions }) { $c->log->debug($division->team_seasons->grid_positions_filled); # 这是因为 $division->team_seasons 是一个结果集对象 }

但是,在我的模板中(已隐藏 $divisions),我无法访问 grid_positions_filled 对象,因为 division.team_seaons 为我提供了该部门中团队结果集的数组引用:

[% # 循环遍历我们的部门 FOREACH 部门 IN 部门; CALL c.log.debug(division.team_seasons); # 输出类似于:ARRAY(0x6f8318c) 结尾; -%]

我在控制器中获得的相同调试日志的输出更像是结果集对象的列表:

TopTable::Model::DB::TeamSeason=HASH(0x6eea94c) TopTable::Model::DB::TeamSeason=HASH(0x6f01834) TopTable::Model::DB::TeamSeason=HASH(0x6ef5284) TopTable::Model::DB::TeamSeason=HASH(0x6efec9c) TopTable::Model::DB::TeamSeason=HASH(0x6ef4dc4) TopTable::Model::DB::TeamSeason=HASH(0x6faf0ac) TopTable::Model::DB::TeamSeason=HASH(0x6eefa04)

希望这一切都有意义!有谁知道我如何将控制器的行为放入模板中,以便我可以访问 team_season ResultSet 上的方法?

非常感谢您。

【问题讨论】:

  • 看起来像标量与列表上下文问题。尝试team_seasons_rs 强制返回列表上下文中的结果集。
  • 对不起@nwellnhof,我不确定我是否关注 - 我应该把team_seasons_rs放在哪里?据我了解,team_seasons 指的是两个表之间的关系名称,team_seasons_rs 不是有效的关系名称?
  • DBIC 还创建了一个特殊版本的关系访问器,后缀为_rs。见the docs
  • 啊,我明白了,太好了,非常感谢! (如果您将其发布为答案,我认为我可以接受?Stack Overflow 的新手(不仅仅是潜伏!)

标签: perl catalyst dbix-class template-toolkit


【解决方案1】:

尝试$self->search_rs 而不是$self->search。 “这个方法和 search() 做的事情完全一样,只是它总是返回一个结果集,即使在列表上下文中也是如此。”

See the docs 了解更多信息。

【讨论】:

  • 感谢您的回复 - 我认为它看起来可能有效,但我仍然得到相同的结果:WHILE (division = divisions.next); CALL c.log.debug(division.team_seasons); END; 这仍然给了我:ARRAY(0x6e3a08c)。
  • 我的猜测是,这仍然是关系(team_seasons)的上下文问题。您可以尝试查看 template-toolkit.org/docs/modules/Template/Stash/Context.html 我没有亲自使用过它,但它可以让您通过类似 c.log.debug(division.team_seasons.scalar) 的方式强制标量上下文
  • @nwellnhof 上面的评论指出“DBIC 还创建了一个特殊版本的以 _rs 为后缀的关系访问器”,这是我不知道的,它提供了一个比使用简单得多的解决方案不同的模板存储。
  • 确实,但有人告诉我标量也可以工作 - 诚然,由于您刚才提到的原因,我没有尝试过,但非常感谢您的帮助。
【解决方案2】:

team_seasons 访问器在标量上下文中返回一个结果集,在列表上下文中返回一个行数组。似乎模板工具包代码在列表上下文中评估访问器。

作为一种解决方法,DBIC 安装了一个特殊的访问器,后缀为_rs,无论上下文如何,它总是返回一个结果集。所以以下应该工作:

CALL c.log.debug(division.team_seasons_rs.grid_positions_filled);

这记录在DBIx::Class::Relationship 下。

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 2011-06-27
    • 2011-07-19
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    相关资源
    最近更新 更多