DBIx::Class:Template Toolkit 中的子结果集显示为数组,而不是结果集

DBIx::Class: sub resultset in Template Toolkit presented as an array, not a resultset

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


    子 divisions_and_teams_in_season {
      我的 ($self, $season, $grid) = @_;

      return $self->search({
          "division_seasons.season" => $season->id,
          "division_seasons.fixtures_grid" => $grid->id,
        }, {
        预取 => [
          "division_seasons",
          {
            "team_seasons" => {
              "team" => [{
                  "club" => "venue"
                },
                "home_night"
              ]
            }
          }
        ],
        order_by => {
          -asc => [ qw( division_seasons.rank team_seasons.grid_position club.short_name team.name ) ]
        }
      });
    }

这 return 是我期望的数据,我能够在我的控制器代码中执行以下操作以取回我的结果集并遍历 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 部门在部门;
      调用 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 上的方法?

非常感谢您。

尝试 $self->search_rs 而不是 $self->search。 "This method does the same exact thing as search() except it will always return a resultset, even in list context."

See the docs 了解更多信息。

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

作为变通方法,DBIC 安装了一个特殊的访问器,后缀为 _rs,无论上下文如何,它总是 returns 结果集。所以以下应该有效:

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

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