ページング処理のメモ

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;
}