2017-01-29 2 views
1

Ich arbeite schon seit einiger Zeit mit Catalyst und DBIC, habe aber nie selbst ein Projekt gestartet. Jetzt erstelle ich eine Webapp-Datenbank von Grund auf neu und ich begann mich zu fragen, ob ich Daten in weniger Codezeilen abrufen könnte. Ich werde mit einem Teil des Schema-Diagramms weitermachen, um es klarer zu machen. Lassen Sie uns sagen, dass wir eine Datenbank wie dieses:DBIC tritt der Catalyst Web App bei

Schema diagram extract

Normalerweise, wenn ich wollte, sagen wir, alle Informierte Einwilligung von einem bestimmten Thema unterzeichnet holen, würde ich so etwas wie dieses:

my $consentsignatures_mod = $c->model('pbitdb::InformedConsentSubjectSignature'); 
my $subject_consents = $consentsignatures_mod->search(
     {subject_id => $subject_id}, 
     {join => 'consent'}, 
    ); 
$c->stash->{subject_consents}; 

und dann in der Vorlage würde ich durch die resultset wie

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

in ähnlicher Weise für die Krankheiten und die Familiengeschichte durchlaufen, würde ich einen separa machen Suchen Sie nach subject_id in der entsprechenden Verknüpfungstabelle und verbinden Sie sie mit dem übergeordneten (Präzedenzfälle), um die Präzedenzdaten zu erhalten. Das funktioniert gut, aber wenn man bedenkt, dass ich auch eine Menge Informationen von einem Dutzend weiterer Tabellen abrufen muss (wie die der Familien- und Krankheitsgeschichte mit ihren entsprechenden Beziehungen zur Präzedenzfalltabelle), dachte ich, ich sollte verschachtelte Joins ausprobieren. Also ich habe ... versuchen, und dies kam heraus:

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 

Weder Syntaxfehler noch DBIC Ausnahmen entstehen so, ich denke, der obige Code in Ordnung ist. Ich habe jedoch Probleme beim Drucken der Daten in der Vorlage. Wenn ich die Informierte Einwilligung abrufen möchten, würde ich so etwas wie:

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

Alle oben kommt leer wie meine Träume. Irgendwelche Ideen?

Antwort

1

Mit join geben Sie nur DBIC an, diese Tses beizutreten, aber Daten von ihnen zu holen. Ersetzen Sie es mit Prefetch und Sie werden sehen, dass das generierte SQL auch alle verwandten Spalten auswählen wird. Beachten Sie, dass Sie get_column nur für spezielle Fälle verwenden sollten, in denen Sie die Raw-Datenbankwerte benötigen. Verwenden Sie normalerweise nur die generierten Spaltenaccessoren, die standardmäßig den Spaltennamen verwenden.

+0

Entschuldigung für die Verzögerung, wurde in einem anderen Projekt gefangen und konnte dies bisher nicht testen. Ich bemerkte, dass ich Prefetch verwenden konnte, aber den Unterschied nicht verstand, also ging ich mit dem Good'ol Join. Ihre Empfehlung funktioniert. Danke vielmals! –

Verwandte Themen