以前も書いたように 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 したい場合とかのことを考えると使って損はありませんよね)。