2017-01-29 19 views
1

저는 Catalyst 및 DBIC를 사용하여 잠시 동안 작업을 해봤지만 직접 프로젝트를 시작한 적이 없습니다. 이제는 처음부터 webapp 데이터베이스를 작성하고 있으며 더 적은 코드 행에서 데이터를 가져올 수 있는지 궁금해하기 시작했습니다. 스키마의 다이어그램을 더 명확하게하기 위해 바로 살펴 보겠습니다. 이제 우리는이 같은 데이터베이스가 있다고 가정 해 봅시다 :DBIC가 Catalyst 웹 응용 프로그램에 합류했습니다.

Schema diagram extract

일반적으로, 나는, 말, 인출하기를 원한다면 특정 주제에 의해 서명 된 모든 정보를 동의, I 좋겠 그래서 이런 식으로 뭔가 :

my $consentsignatures_mod = $c->model('pbitdb::InformedConsentSubjectSignature'); 
my $subject_consents = $consentsignatures_mod->search(
     {subject_id => $subject_id}, 
     {join => 'consent'}, 
    ); 
$c->stash->{subject_consents}; 

그리고 템플릿에 내가 마찬가지로

[% WHILE (consent_signatures = subject_consents.next()) -%] 
      <tr> 
       <td> [% consent_signatures.consent.get_column('consent_title') -%]</td> 
       <td> [% consent_signatures.consent.get_column('consent_type') -%]</td> 
       <td> [% consent_signatures.consent.get_column('consent_description') -%]</td> 
       <td> [% consent_signatures.consent.get_column('consent_form_version') -%]</td> 
       <td> [% consent_signatures.get_column('signed_date') -%]</td> 
      </tr> 
    [% END -%] 

같은 결과 집합을 반복 할 것, 질병 및 가족 역사, 나는 separa를 만들 것 te는 해당 연결 테이블에서 subject_id를 검색하고이를 상위 (이전)에 연결하여 선행 데이터를 얻습니다. 이것은 잘 작동하지만, 가족과 병력과 관련하여 전례 표와 관련하여 12 개의 테이블에서 오는 수많은 정보를 검색해야한다는 것을 고려할 때 중첩 된 조인을 시도해야한다고 생각했습니다. 그래서 난 ... 시도 않았고,이 나왔다 :

my $subject_info = $subject_mod->search(
    {subject_id => $subject_id}, 
    {join => [{'disease_histories' => 'precedent'}, 
     {'informed_consent_subject_signatures' => 'consent'} 
     {'familial_history' => 'precedent'}]} 
); 
    $c->stash->{subject} = $subject_info 

어느 구문 오류도 DBIC 예외 그래서 것 같아요, 위의 코드는 OK입니다 발생한다. 그러나 템플릿에 데이터를 인쇄하는 데 문제가 있습니다. 정보통 동의를 검색하려면 다음과 같이하십시오.

[% WHILE (consent_signatures = subject.informed_consent_subject_signatures.next()) -%] 
      <tr> 
       <td> [% consent_signatures.consent.get_column('consent_title') -%]</td> 
       <td> [% consent_signatures.consent.get_column('consent_type') -%]</td> 
       <td> [% consent_signatures.consent.get_column('consent_description') -%]</td> 
       <td> [% consent_signatures.consent.get_column('consent_form_version') -%]</td> 
       <td> [% consent_signatures.get_column('signed_date') -%]</td> 
      </tr> 
    [% END -%] 

위의 내용은 모두 내 꿈처럼 비어 있습니다. 어떤 아이디어?

답변

1

조인을 사용하면 DBIC에게 해당 tsbles에 참여하지만 데이터를 가져 오라고 지시합니다. 프리 페치로 바꾸면 생성 된 SQL이 모든 관련 열을 선택한다는 것을 알 수 있습니다. 원시 데이터베이스 값이 필요한 특수한 경우에만 get_column을 사용해야하며 일반적으로 생성 된 열 접근자를 기본값 인 열 이름으로 사용하십시오.

+0

지연으로 인해 미안, 다른 프로젝트에 걸려 지금까지 이것을 테스트 할 수 없었습니다. 내가 프리 페치를 사용할 수 있다는 것을 알았지 만 차이점을 얻지 못해서 good'ol join으로 갔다. 귀하의 권장 사항이 적용됩니다. 고마워요! –