模型中功能的 Codeigniter 4 分页

Codeigniter 4 pagination on function in model

我目前受困于 CI4 的内置分页。 我尝试在我的模型中对函数的结果进行分页,但它不起作用:

我的模特:

<?php

namespace App\Models;

use CodeIgniter\Model;

class CategoriesModel extends Model
{

    protected $table = 'categories';
    protected $allowedFields = [];
    protected $beforeInsert = ['beforeInsert'];
    protected $beforeUpdate = ['beforeUpdate'];

    //Kategorie(n) laden
    public function getCategories($categoryID = null)
    {
        $db = \Config\Database::connect();

        if (!$categoryID) {
            $builder = $db->table('categories');
            $query   = $builder->get();
            $results = $query->getResultArray();
        } else {
            $builder = $db->table('categories');
            $query   = $builder->where('categoryID', $categoryID);
            $query   = $builder->get();
            $results   = $query->getRow();
        }

        return $results;
    }
}

在我的控制器中,我尝试对模型中“getCategories”函数的结果进行分页:

<?php

namespace App\Controllers;

use App\Models\CategoriesModel;
use App\Models\PodcastsModel;

class Categories extends BaseController
{
    public function index($page = 1)
    {
        $this->request->setLocale(session()->get('locale'));

        //Helper laden
        helper(['form', 'template', 'userrights']);
        $data['template'] = getTemplate();

       
        $model = new CategoriesModel;

        $data['categories'] = $model->getCategories()->paginate(5, 'test', $page, 2);

        $data['pager'] = $model->pager;

        //Recht "13" (Benutzergruppen) prüfen
        if ($data['userrights'][13] == 0) {
            return redirect()->to('/admin');
        }

        //Views aufbauen
        echo view($data['template'] . '/templates/header', $data);
        echo view($data['template'] . '/backend/navigation');
        echo view($data['template'] . '/templates/sidebar');
        echo view($data['template'] . '/backend/categories');
        echo view($data['template'] . '/templates/footer');
    }
}

所以行

$data['categories'] = $model->getCategories()->paginate(5, 'test', $page, 2);

会导致以下错误:

Error Call to a member function paginate() on array

当我使用

$data['categories'] = $model->paginate(5, 'test', $page, 2);

它工作得很好。但它对模型中声明的类别 table 的所有结果进行分页。

但是因为我想对函数的结果进行分页,这取决于我传递给模型的变量,

有没有办法将分页 class 用于模型函数?

您没有正确使用分页库。它必须在查询构建器的末尾使用,而不是 get() 例如。

您的模型可以 return 分页对象。

public function getCategories($nb_paginate, $categoryID = null)
    {
        $db = \Config\Database::connect();

        if (!$categoryID) {
            $results = $this->paginate($nb_paginate);
        } else {
            $results = $this->where('categoryID', $categoryID)->paginate($nb_paginate);
        }

        return $results;
    }

然后用你的控制器捕捉它

$data['categories'] = $model->getCategories(5);
$data['pager'] = $model->pager;

您可能还想看看文档:https://codeigniter.com/user_guide/libraries/pagination.html

不知道这是否是“有效代码”(我是这个正式的 CI4 模型名称空间等的新手)。但这对我来说很好。只需确保在生产中正确过滤您的“搜索”以确保安全

控制器:

$filter['search'] = $this->request->getGet('search');
$this->template->data['customers'] = $customer_model->get_customers_index($filter)->paginate(50);
$this->template->data['pager'] = $customer_model->pager;

型号:

function get_customers_index($filter)
{
    if (isset($filter['search']) and $filter['search'])
    {
      
        $this->like('id_number', $filter['search']);

    }
    return $this;
    
}