mysql - DBIC 加入 Catalyst Web 应用程序

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

以上一切都如我的梦想一样落空。有什么想法吗?

最佳答案

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

关于mysql - DBIC 加入 Catalyst Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41924900/

相关文章:

php - 在ajax post mysql上形成序列化非法字符串偏移量 ''

linux - Perl 帮助 : Can't call method "display" on an undefined value

perl - 您如何全局更改 Catalyst 中的默认内容类型?

mysql - 为什么我在过程中收到 ERROR 1064 (42000) mysql 错误?

mysql - Sum 函数仅返回一层层次结构

Perl 自动装箱和运算符重载似乎不起作用?

perl - 如何在单个 Perl 正则表达式中同时执行负向前查找和负向后查找?

perl - 我应该如何使用作业队列 [和 Perl/Catalyst] 最好地构建我的 Web 应用程序?

perl - 如何将公共(public)路径转发到另一个 Catalyst Controller ?

python - Flask SqlAlchemy 加入两个没有外键的模型 MYSQL