5

我正在尝试根据文档在 Codeigniter 4 中启动分页功能。

$model = new \App\Models\UserModel();

$data = [
    'users' => $model->paginate(10),
    'pager' => $model->pager
];

我的控制器代码如下:

public function jobmarket() {
    $this->jobs = new \App\Models\Jobs();

    if (!$this->ionAuth->loggedIn())
    {
        return redirect()->to('/logg-inn');
    }

    echo view("dashboard/header", ([
        'ionAuth' => $this->ionAuth,
        'uri' => $this->uri,
    ]));

    echo view("dashboard/jobmarket", ([
        'session' => $this->session,
        'ionAuth' => $this->ionAuth,
        'validation' => $this->validator,
        'jobs' => $this->jobs->paginate(20)->all_jobs(),
        'pager' => $this->jobs->pager()->all_jobs(),
    ]));

    echo view("assets/footer");

}

但是,在运行此程序时,我收到以下错误:

Argument 1 passed to CodeIgniter\Database\BaseResult::getResult() must be of the type string, null given, called in xxxx/app/vendor/codeigniter4/framework/system/Model.php on line 447

这是我的模型

public function all_jobs() {
    $this->categories = new \App\Models\Categories();
    $builder = $this->db->table('jobs');
    $builder->select('*');
    $builder->join('users', 'users.id = jobs.jobs_u_id');
    $builder->join('categories', 'category_id = jobs.jobs_category');
    // Make sure to not show current user's listings, since these will show up under "My listings"
    $builder->where('jobs_u_id !=', $this->current_user->id);
    // Check that the listing reflects users chosen categories
    $builder->whereIn('category_id', $this->categories->user_categories());
    $builder->orderBy('jobs_id', 'desc');
    $query =  $builder->get();
    if ($builder->countAllResults() > 0)
    {
        return $query->getResult();

    } else {
        return false;
    }
}

任何解决此问题的帮助将不胜感激。

4

3 回答 3

3

我不知道你到底从哪里得到这个错误,但我在你的代码中发现了一些错误。尝试修复这些错误,也许它可以帮助你。以下是错误:

  1. paginate()方法返回结果,因此它必须是链中的最后一个。例子:$this->jobs->all_jobs()->paginate(20)
  2. 你可以得到Pager这样的:$this->jobs->pager
  3. 如果你想在方法中使用你all_jobs()的方法,你必须在你的方法paginate()中返回一个模型all_jobs()

这是您的控制器的正确代码:

public function jobmarket() {
    $this->jobs = new \App\Models\Jobs();

    if (!$this->ionAuth->loggedIn())
    {
        return redirect()->to('/logg-inn');
    }

    echo view("dashboard/header", ([
        'ionAuth' => $this->ionAuth,
        'uri' => $this->uri,
    ]));

    echo view("dashboard/jobmarket", ([
        'session' => $this->session,
        'ionAuth' => $this->ionAuth,
        'validation' => $this->validator,
        'jobs' => $this->jobs->all_jobs()->paginate(20),
        'pager' => $this->jobs->pager,
    ]));

    echo view("assets/footer");
}

这是您模型的正确代码:

public function all_jobs() {
    $this->categories = new \App\Models\Categories();
    $builder = $this->db->table('jobs');
    $builder->select('*');
    $builder->join('users', 'users.id = jobs.jobs_u_id');
    $builder->join('categories', 'category_id = jobs.jobs_category');
    // Make sure to not show current user's listings, since these will show up under "My listings"
    $builder->where('jobs_u_id !=', $this->current_user->id);
    // Check that the listing reflects users chosen categories
    $builder->whereIn('category_id', $this->categories->user_categories());
    $builder->orderBy('jobs_id', 'desc');

    return $this;
}

要查看导致错误的确切位置,请尝试在根目录CI_ENVIRONMENT = development中的文件中进行设置。.env之后尝试重新加载您发现此错误的页面。您将看到带有回溯的 CodeIgniter 错误页面。尝试从回溯复制所有数据并将其放置在此处,这有助于了解到底发生了什么。

于 2020-04-22T20:04:28.340 回答
0

去掉Model类的构造函数解决问题

> Argument 1 passed to CodeIgniter\Database\BaseResult::getResult()
> pagination
于 2021-06-08T16:38:07.833 回答
0

findAll()就我而言,我必须用我自己的方法重写findAll(),并检查我的特定模型是否扩展了ModelCodeIgniter 的类。

我基本上得到了和你@kanarifugl一样的错误。

所以我有这样的事情:

<?php namespace App\Models;

use CodeIgniter\Model;

class BlogModel extends Model
{
    protected $db;

    public function __construct() 
    {
        parent::__construct();
        $this->db = \Config\Database::connect();
        $this->table = 'Blog';
    }

    public function findAll(int $limit = 12, int $offset = 0)
    {
        $builder = $this->builder();
        $builder->select('*');
        $builder->orderBy('blog_id', 'DESC');
        $builder->join('Categories', 'Categories.category_id = Blog.category_id');

        if ($this->tempUseSoftDeletes === true)
        {
            $builder->where($this->table . '.' . $this->deletedField, null);
        }

        $row = $builder->limit($limit, $offset)
                ->get();

        $row = $row->getResult($this->tempReturnType);

        $eventData = $this->trigger('afterFind', ['data' => $row, 'limit' => $limit, 'offset' => $offset]);

        $this->tempReturnType     = $this->returnType;
        $this->tempUseSoftDeletes = $this->useSoftDeletes;

        return $eventData['data'];
    }
}

然后在我的博客控制器中,我刚刚有了这个:

<?php namespace App\Controllers;

class Blog extends BaseController
{
    private $blogModel;

    public function __construct() 
    {
        $this->blogModel = new \App\Models\BlogModel();
    }

    public function index()
    {
        $data = [
            'section' => 'blog',
            'articles' => $this->blogModel->paginate(12, 'blog'),
            'pager' => $this->blogModel->pager
        ];
        echo view('articules', $data);
    }
}

最后,在我看来,使用寻呼机的部分是这样的:

<?= $pager->links('blog') ?>

我希望这可以帮助别人。

于 2020-07-07T01:23:04.163 回答