模型中功能的 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;
}
我目前受困于 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;
}