2017-01-29 4 views
1

私はCatalystとDBICをしばらく使っていましたが、自分でプロジェクトを始めたことはありません。今、私は最初からwebappデータベースを作成しており、コードの行数を減らしてデータを取得できるかどうか疑問に思っています。私は、スキーマの図をより明確にするために、スキーマの図を参照していきます。我々はこのようなデータベースを持っているとしましょう:DBICがCatalystウェブアプリケーションに参加

Schema diagram extract

通常、私は、たとえば、特定の被験者が署名したすべてのインフォームドコンセントを取得したい場合、私は思いますので、このような何か:

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を検索し、それを親(前例)に結合して先例データを取得する。これはうまくいきますが、十数個のテーブルから得られる大量の情報を取得する必要があることを考慮すれば、ネストされた結合を試してみるべきだと思いました。だから私は...てみましたが、これは出てきた:どちらも構文エラーもDBICの例外が発生するので、

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 

、私は推測し、上記のコードは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もすべての関連する列を選択することがわかります。 rawデータベース値が必要な特別な場合にのみget_columnを使用する必要があります。通常は、デフォルトで列名に生成された列アクセサを使用します。

+0

遅れて申し訳ありませんが、別のプロジェクトに巻き込まれ、今までこれをテストできませんでした。私はプリフェッチを使うことができることに気付きましたが、違いを得られなかったので、good'olに参加しました。 あなたのお勧めは機能します。どうもありがとう! –

関連する問題