【问题标题】:Codeigniter 4 pagination on function in modelCodeigniter 4对模型中的功能进行分页
【发布时间】:2021-02-06 06:56:04
【问题描述】:

我目前被 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);

会导致如下错误:

错误 调用数组上的成员函数 paginate()

当我使用时

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

它工作得很好。但它对类别表中的所有结果进行分页,正如模型中声明的那样。

但由于我想对函数的结果进行分页,具体取决于我传递给模型的变量,

有没有办法将分页类用于模型功能?

【问题讨论】:

  • 问题在于您的 $results 退货声明。您正在返回最终结果(即数组),因此您无法链接方法。尝试返回可以链接的对象,而不是结果。我通常使用 Repository 模式,链接方法来实现链接而不是扩展模型并将方法包含在模型本身中。

标签: php codeigniter model pagination codeigniter-4


【解决方案1】:

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

您的模型可以返回分页对象。

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

【讨论】:

    【解决方案2】:

    不知道这是否是“有效代码”(我是这个正式的 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;
        
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 2020-10-27
      • 2017-06-22
      • 1970-01-01
      • 2020-07-18
      相关资源
      最近更新 更多