You need to enable JavaScript to run this app. CodeIgniter 4 如何将模型方法与分页同行编写实现多列表独立分页
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter 4 如何将模型方法与分页同行编写实现多列表独立分页

CodeIgniter 4 单页多数据集独立分页实现方案

核心实现逻辑

CI4 内置的分页服务默认仅支持单组分页,要实现三个漫画列表的独立翻页,核心是为每个列表绑定独立的分页组标识,避免不同列表的翻页参数互相串扰。

控制器层修改

移除之前直接在数组里链式调用分页的写法,按照下面的结构调整:

public function komik()
{
    $pager = \Config\Services::pager();

    // 分别为三个列表配置独立的每页显示条数
    $allPerPage = 4;
    $regulerPerPage = 4;
    $plusPerPage = 4;

    $data = [
        'title' => 'komik learn',
        // 调用模型方法时传入独立的组名
        'komik' => $this->komikModel->getKomikAll($allPerPage, 'komik_all'),
        'koikkreguler' => $this->komikModel->getKomikReguler($regulerPerPage, 'komik_reguler'),
        'komikplus' => $this->komikModel->getKomikPlus($plusPerPage, 'komik_plus'),
        // 单独生成每个分组的分页链接对象,传入视图
        'pagerAll' => $pager->makeLinks(
            $this->request->getGet('komik_all_page') ?? 1,
            $allPerPage,
            $this->komikModel->getTotalAllCount(),
            'default_full',
            'komik_all'
        ),
        'pagerReguler' => $pager->makeLinks(
            $this->request->getGet('komik_reguler_page') ?? 1,
            $regulerPerPage,
            $this->komikModel->getTotalRegulerCount(),
            'default_full',
            'komik_reguler'
        ),
        'pagerPlus' => $pager->makeLinks(
            $this->request->getGet('komik_plus_page') ?? 1,
            $plusPerPage,
            $this->komikModel->getTotalPlusCount(),
            'default_full',
            'komik_plus'
        ),
    ];
   
    return view('komik/index', $data);
}

之前尝试的链式调用写法无法生效的核心原因:没有给每个分页分配独立组名,框架会把所有查询绑定到同一个默认URL分页参数上,最终会出现点任意一个列表的翻页按钮,其他列表的页码同步跳转的问题。

模型层匹配调整

修改三个查询方法,接收每页条数、分页组名两个入参,调用框架内置的paginate()方法时传入对应组名:

// 模型中getKomikAll方法修改示例
public function getKomikAll($perPage = 10, $groupName = 'default')
{
    return $this->orderBy('created_at', 'DESC')
                ->paginate($perPage, $groupName);
}

// 其余两个查询方法getKomikReguler、getKomikPlus按照同样逻辑修改即可

视图层渲染调整

不需要调用全局的$pager->links()方法,直接把控制器传入的三个独立分页对象渲染在对应列表的下方:

<!-- 全量漫画列表区域 -->
<?php foreach ($komik as $item): ?>
    <div class="komik-card">
        <!-- 卡片内容渲染 -->
    </div>
<?php endforeach; ?>
<!-- 全量列表的分页组件 -->
<?= $pagerAll ?>

<!-- 普通漫画列表区域 -->
<?php foreach ($koikkreguler as $item): ?>
    <div class="komik-card">
        <!-- 卡片内容渲染 -->
    </div>
<?php endforeach; ?>
<!-- 普通列表的分页组件 -->
<?= $pagerReguler ?>

<!-- Plus漫画列表区域 -->
<?php foreach ($komikplus as $item): ?>
    <div class="komik-card">
        <!-- 卡片内容渲染 -->
    </div>
<?php endforeach; ?>
<!-- Plus列表的分页组件 -->
<?= $pagerPlus ?>

常见注意事项

  • 三个分页组的名称不能重复,也不能和框架默认的default组名冲突,否则会出现页码串扰
  • 每个分页组对应的总数据量需要单独统计,不能共用同一个总数值,否则会显示错误的总页数
  • 框架会自动为每个分页组生成独立的URL参数,比如全量列表的页码参数为komik_all_page=2,普通列表为komik_reguler_page=3,Plus列表为komik_plus_page=4,不同参数互不影响

内容的提问来源于stack exchange,提问作者rayhan aulian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 21:36:05