DBIC で JOIN (prefetch) と rows の相性よくない?
以前も書いたように DBIC でのリレーションは,PREFETCH すると INNER JOIN や OUTER JOIN な SQL が発行されます。一方,ページャとして有用な page, rows アトリビュートは LIMIT, OFFSET を利用しています。ですから,
my $artists = $schema->resultset('Artist')->search( { }, { page => 1, rows => 5, prefetch => [ 'albums' ], } );
みたいにして artist を5人アルバム情報込みでゲットだぜ,と思うとはまります(アルバム情報5つ分だけゲットだぜ)。と思う(すくなくとも 0.60 では)。というか今日はまりました。原理としては「たしかにそうだろ」とは思うのですが,直感的じゃないですね。
では,どうするかというと,
my $artists = $schema->resultset('Artist')->search( { }, { page => 1, rows => 5, } ); while (my $artist = $artists->next) { my $albums = $artist->search_related('albums'); # ... # blah blah # ... }
みたく自力でフェッチしていくしか(むろんこの例だと search_related 使わなくても $artist->albums でとれるんですが,より凝った条件を指定したかったり,Artist からさらに prefetch したい場合とかのことを考えると使って損はありませんよね)。