DBIC присоединяется к веб-приложению Catalyst

Я уже некоторое время работаю с Catalyst и DBIC, но никогда не начинал проект самостоятельно. Теперь я создаю базу данных веб-приложения с нуля, и я начал задаваться вопросом, могу ли я сделать выборку данных с меньшим количеством строк кода. Я пойду вперед с куском диаграммы схемы, чтобы сделать его более ясным. Допустим, у нас есть такая база данных:

Извлечение схемы

Обычно, если бы я хотел получить, скажем, все информированные согласия, подписанные конкретным субъектом, я бы сделал что-то вроде этого:

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

Все вышеперечисленное оказывается пустым, как мои мечты. Любые идеи?


person Leitouran    schedule 29.01.2017    source источник


Ответы (1)


Используя join, вы только говорите DBIC присоединиться к этим таблицам, но получить от них данные. Замените его на prefetch, и вы увидите, что сгенерированный SQL также выберет все связанные столбцы. Обратите внимание, что вы должны использовать get_column только в особых случаях, когда вам нужны необработанные значения базы данных, обычно просто используйте сгенерированные методы доступа к столбцу, которые по умолчанию соответствуют имени столбца.

person Alexander Hartmaier    schedule 29.01.2017
comment
Извините за задержку, попал в другой проект и не мог проверить это до сих пор. Я заметил, что могу использовать предварительную выборку, но не совсем понял разницу, поэтому я выбрал старое доброе соединение. Ваша рекомендация работает. Большое спасибо! - person Leitouran; 02.02.2017