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,通常只使用默认为列名的生成的列访问器。
我使用 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,通常只使用默认为列名的生成的列访问器。