2015-02-04 1 views
0

DBIx :: Class 및 Template Toolkit을 사용하여 Catalyst 응용 프로그램을 개발 중입니다. 내가 기대하고 나는 할 수 있어요으로이 데이터를 반환DBIx :: Class : 템플릿 툴킷의 하위 결과 집합이 결과 집합이 아닌 배열로 표시됩니다.

 

    sub divisions_and_teams_in_season { 
     my ($self, $season, $grid) = @_; 

     return $self->search({ 
      "division_seasons.season"   => $season->id, 
      "division_seasons.fixtures_grid" => $grid->id, 
     }, { 
     prefetch => [ 
      "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) ] 
     } 
     }); 
    } 

: 특정 부분에 내가 문제를 가진 데, 나는 결과 집합 내 ResultSet의 스키마에 다음 함수를 호출하여 사용하여 얻을 수 있습니다 내 컨트롤러 코드에서 다음은 team_seasons을 통해 내 결과 집합을 다시 얻을 반복 :

 

    my $divisions = [ $c->model("DB::Division")->divisions_and_teams_in_season($current_season, $c->stash->{grid}) ]; 

    foreach my $division (@{ $divisions }) { 
     $c->log->debug($division->team_seasons->grid_positions_filled); # This works because $division->team_seasons is a resultset object 
    } 

하지만, 내 템플릿 ($divisions을 은닉 한), 나는 grid_positions_filled 개체에 액세스 할 수 없습니다 해요 division.team_seaons 나을 제공하기 때문에 해당 부서의 팀 결과 집합 arrayref :

 

    [% 
    # Loop through our divisions 
    FOREACH division IN divisions; 
     CALL c.log.debug(division.team_seasons); # The output of this is something like: ARRAY(0x6f8318c) 
    END; 
    -%] 

내 컨트롤러에서 나는 같은 디버그 로그 얻을 출력은 더 ResultSet 오브젝트의 목록과 같다 :

 

    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에 대한 메서드에 액세스 할 수 있도록 컨트롤러에서 템플릿으로 동작을 얻을 수 있는지 알고 있습니까?

대단히 감사합니다.

+0

스칼라 대 목록 컨텍스트 문제 같습니다. 'team_seasons_rs'를 시도해리스트 컨텍스트에서 결과 세트를 강제로 반환하십시오. – nwellnhof

+0

미안합니다. @nwellnhof, 잘 모르겠습니다 - 어디에서 'team_seasons_rs'를 써야합니까? 이해할 수 있듯이,'team_seasons'는 두 테이블 사이의 관계 이름을 참조하고'team_seasons_rs'는 유효한 관계 이름이 아닙니까? – Chris

+1

DBIC는'_rs'를 후행하는 관계 액세서의 특별 버전을 생성합니다. [the docs] (https://metacpan.org/pod/DBIx::Class::Relationship#has_many)를 참조하십시오. – nwellnhof

답변

0

접근자는 team_seasons 접근자를 스칼라 컨텍스트에서 결과 집합을 반환하고 목록 컨텍스트에서 행 배열을 반환합니다. 템플릿 툴킷 코드는 목록 컨텍스트에서 액세서를 평가하는 것 같습니다.

임시 해결 방법으로 DBIC는 문맥에 관계없이 항상 결과 집합을 반환하는 _rs과 함께 특수 액세스자를 설치합니다. 따라서 다음과 같이 작동해야합니다.

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

이 내용은 DBIx::Class::Relationship에 문서화되어 있습니다.

2

$self->search 대신 $self->search_rs을 시도하십시오. "이 방법은 목록 컨텍스트에서도 항상 결과 세트를 반환한다는 점을 제외하면 search()와 똑같은 작업을 수행합니다."

See the docs 자세한 내용은

+0

답장을 보내 주셔서 감사합니다. 작동하는 것처럼 보이지만 여전히 똑같은 것을 얻었습니다. 'WHILE (부문 = divisions.next) CALL의 c.log.debug (division.team_seasons) END는,' 이 아직도 날 제공 : ARRAY (0x6e3a08c를) – Chris

+0

내 생각은 여전히 ​​컨텍스트 잡았다 점이다. 관계에 (team_seasons). 당신은 http://www.template-toolkit.org/docs/modules/Template/Stash/Context.html 볼 수 있습니다. 개인적으로 사용하지 않은 있지만 스칼라 강제로 허용 할 것이다 문맥을 통해'c.log.debug (division.team_seasons.스칼라)' – oalders

+0

위의 @nwellnhof에 의한 의견은 "DBIC도 _rs로 후속되는 관계 수납 자의 특수 버전을 만듭니다"라고 지적하고 내가 인식하지 못했던 다른 템플릿 접두사를 사용하는 것보다 훨씬 간단한 솔루션을 제공합니다 . – oalders

관련 문제