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でゴニョゴニョしてます。