我已经和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_I d,并将其连接到父(先例)以获取先例数据。这样做很好,但是考虑到我还需要从十几个表中检索大量信息(比如那些与先例表有对应关系的家族史和疾病史表),我想我应该尝试嵌套连接。所以我。。。试试看,结果出来了:
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加入那些tsble,但要从中获取数据。
用prefetch替换它,您将看到生成的SQL还将选择所有相关列。
注意,对于需要原始数据库值的特殊情况,应该只使用get_column,通常只使用默认为列名的生成列访问器。
关于mysql - DBIC加入Catalyst网络应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41924900/