DBIC加入Catalyst Web应用程序

时间:2017-01-29 19:15:50

标签: mysql perl catalyst dbix-class template-toolkit

我已经和Catalyst和DBIC合作了一段时间,但我自己从未开始过一个项目。现在我从头开始创建一个webapp数据库,我开始怀疑是否可以用更少的代码行来获取数据。我将继续使用一小块架构图来使其更清晰。假设我们有一个这样的数据库:

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 -%]

同样,对于疾病和家族病史,我会在相应的链接表中单独搜索subject_id,并将其连接到父(先例)以获取先前数据。这工作得很好,但考虑到我还要从十几个表中找回大量信息(比如家族和疾病历史以及它们与先例表的对应关系),我想我应该尝试嵌套连接。所以我做了......试试,结果出来了:

  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异常都没有出现,我猜,上面的代码没问题。但是,我在打印模板中的数据时遇到了麻烦。如果我想获得知情同意,我会做类似的事情:

    [% 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 个答案:

答案 0 :(得分:2)

使用join只会告诉DBIC加入这些tsbles但是要从中获取数据。 将其替换为prefetch,您将看到生成的SQL也将选择所有相关列。 请注意,对于需要原始数据库值的特殊情况,您应该只使用get_column,通常只使用默认为列名的生成列访问器。