ページング処理のメモ
CPANモジュールにData::Pageってモジュールがあります。
kazeburoさん作のData::Page::Navigationでより便利に使えます。
これをベースにページング周りをちょろっとつくってみたときのメモ。
なんかいいページング関連のモジュールあれば使いたいですが、、、
まんまコピッても動かないので注意してください。
メモです。
package MyDBM; use Data::Page::Navigation; ・ ・ ・ sub select_with_pager { my ($self, %args) = @_; my $dbh = $args{_dbh} || $self->connect; # このへんに引数チェック ・ ・ ・ # ページャー関連の文字セット。未設定ならデフォルト埋め込むとかの処理とかいれたり。 my $entries_per_page = $args{page_data}->{entries_per_page} || $DEFAULT_entries_per_page; my $pages_per_navigation = $args{page_data}->{pages_per_navigation} || $DEFAULT_pages_per_navigation; my $current_page = $args{page_data}->{current_page} || 1; my $offset = $entries_per_page*($current_page-1); # COUNT(*)だとスペックおちる?InnoDB的にはよろしくなさそうってことで。 $args{_sql} =~ s/^select /select SQL_CALC_FOUND_ROWS /i; $args{_sql} .= ' LIMIT ? OFFSET ?'; push @{$args{_bind_values}}, ($entries_per_page, $offset); my $itr = $self->do_sql(%args); my $total_rows = $self->do_sql( _sql => 'SELECT FOUND_ROWS() AS row', _dbh => $dbh, ); my $total_entries = ${$total_rows->fetch()}[0]; my $pager = Data::Page->new( $total_entries, $entries_per_page, $current_page, ); $pager->pages_per_navigation($pages_per_navigation); warn $pager->entries_per_page; warn $pager->entries_on_this_page; warn $pager->first; warn $pager->first_page; warn $pager->last;warn $pager->last_page; warn $pager->previous_page; warn $pager->next_page; warn $pager->current_page; dump [$pager->pages_in_navigation ]; dump $pager->pages_per_navigation; return ($pager, $itr); } ・ ・ ・ 1;
呼び出し側ではこんな感じか。
my ($pager, $itr) = MyDBM->select_with_pager( _sql => <<"SQL", SELECT * from test where id between ? and ? SQL page_data => { entries_per_page => 5, pages_per_navigation => 5, current_page => $params->{page}, }, _bind_values => [10,100], _dbh => $dbh, ); while (my $row = $itr->fetchrow_hashref) { dump $row; }