我已经和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 -%]
同样,对于疾病和家族病史,我会在相应的链接表中单独搜索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 -%]
以上所有内容都像我的梦想一样空洞。有什么想法吗?
答案 0 :(得分:2)
使用join只会告诉DBIC加入这些tsbles但是要从中获取数据。 将其替换为prefetch,您将看到生成的SQL也将选择所有相关列。 请注意,对于需要原始数据库值的特殊情况,您应该只使用get_column,通常只使用默认为列名的生成列访问器。