DBIC 加入 Catalyst Web 应用程序

DBIC joins in Catalyst web app

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

通常情况下,如果我想获取某个特定对象签署的所有知情同意书,我会这样做:

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

同样,对于疾病和家族史,我会在相应的链接 table 中单独搜索 subject_id 并将其加入父(先例)以获得先例数据。这很好用,但考虑到我还必须从更多 table 中检索大量信息(例如家族史和疾病史及其与先例的对应关系 table),我想我应该尝试嵌套连接。所以我做了......尝试,结果出来了:

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

以上都是我梦寐以求的结果。有什么想法吗?

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