Я уже некоторое время работаю с 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 -%]
Все вышеперечисленное оказывается пустым, как мои мечты. Любые идеи?