DBICでネストしたループ
そういえばとあるところで質問を受けたので。
その質問を補う形で。
DBICを使った場合でも普通にネストしたループは使えるわけですが、
TTの場合。
[% WHILE (blogger = blogger_ite.next) %]
[% FOR entry IN blogger.entries %]
URL:[% entry.url %]
[% END %]
[% END %]
こんな感じです。
くるくる回ってくれます。
普通にPerlの処理でもこんな幹事
my $blogger_ite = $self->model('Blogger')->search;
while (my $blogger = $blogger_ite->next) {
for my $entry ( $blogger->entries ) {
print $entry->url,"\n";
}
}
こんな荒業もできます。↓(荒業じゃないけど)
while (my $blogger = $blogger_ite->next) {
for my $entry ( $blogger->entries->search({},{rows => 1})->all ) {
print $entry->url,"\n";
}
}
ちなみにこれは↓無限ループになるので危険です。死ねます。
while (my $blogger = $blogger_ite->next) {
while (my $entry = $blogger->entries->search({},{rows => 1})->next ) {
print $entry->url,"\n";
}
}
確かに$blogger->entriesから普通にsearchをチェーンさせることはできるのですが、
あんましうまみは無いかなぁ。普通ならprefetchしたいところだし。
まあ、やるんであれば、
while (my $blogger = $blogger_ite->next) {
my $entry_ite = $blogger->entries->search({},{rows => 1,page => 1});
while (my $entry = $entry_ite->next) {
print $entry->url,"\n";
}
}
こうかな。
やんないけど。
TTだとネストした側のWHILEがうまくいかんのお。
なんでじゃろ。
でも、prefetchつかうならFORでいい気もするから別にいいのだけれども。