Paginationを考える

Paginationを考える

CodeIgniterにあるPaginationが何だか使いずらい。QueryBuilderはOKだけど$this->dbはNGという仕様らしい。
この辺を加味して使い分ける必要があるようです。

ノーマルなやり方

// Controller
public function index()
{
    $model = model(BookmarkModel::class);
    $result = $model->getDatas(3);

    $data = [
        'bookmarks' => $result,
        'pager' => $model->pager,
    ];

    return view('bookmarks/index', $data);
}

// Model
public function getDatas($perPage = 5)
{
    $result = $this
        ->orderBy('created_at', 'DESC')
        ->paginate($perPage);
    return $result;
}

// View
<?php echo $pager->links('default', 'mypaginate'); ?>

Viewの「mypaginate」はオリジナルのテンプレートで、「/system/Pager/Views/default_full.php」をコピーして作ってます。

Modelで$this->dbを使ってゴニョゴニョやりたい場合

// Controller
public function index()
{
    $model = model(BookmarkModel::class);

    $page = (int) ($this->request->getGet('page') ?? 1);
    $result = $model->getDatas($page, 5);

    $data = [
        'bookmarks' => $result['bookmarks'],
        'pager_links' => $result['pager_links'],
    ];

    return view('bookmarks/index', $data);
}

// Model
public function getDatas($page = 1, $perPage = 5)
{
    $pager = service('pager');
    $offset = $perPage * $page - $perPage;

    $bookmarks = $this->db->table($this->table);
    $total = $bookmarks->countAll();
    $pager_links = $pager->makeLinks($page, $perPage, $total, 'mypaginate');
    $bookmark_result = $bookmarks
        ->select('*')
        ->orderBy('created_at', 'DESC')
        ->limit($perPage, $offset)
        ->get();
    $data = $bookmark_result->getResultArray();

    return array(
        'bookmarks' => $data,
        'pager_links' => $pager_links
    );
}

// View
<?php echo $pager_links; ?>

マニュアルに載っている「ManualPagination」はControllerですが、Modelでゴニョゴニョしてます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です