簡體   English   中英

codeigniter 4 中使用查詢生成器的分頁問題

[英]Pagination problem in codeigniter 4 using Query Buildeer

我對查詢生成器的工作如此熱愛 ci4,但我發現很難進行分頁。

在檢查文檔時,它只解釋了如何將它與 Model 一起使用,沒有查詢生成器解釋。

我嘗試使用手動分頁並在我的查詢中設置偏移量但不能正常工作而不是返回下一個分頁它只返回一個結果用於下一個分頁並將其加入到 ckurent 分頁。 我挑釁地卡在這里。

Controller:

$blog = new BlogModel();

            //* Retrieve blogs
            $total = $blog->getActiveBlogTotal();

            $segment = route_to('adminBlogPost', 'active');
            if($this->request->uri->getTotalSegments() == 4)
            {
                $page = $this->request->uri->getSegment(4);
            }
            else
            {
                $page = 1;
            }
            $perPage = 5;
            $pages = $pager->makeLinks($page, $perPage, $total, 'admin_pag', 5);

            $blogs = $blog->getActiveBlogsInAdmin($page);
            return $this->smarty->view('blog/active.tpl', compact(
                'blogs',
                'pages'
            )); 

Model:

//* Get blog in admin
public function getActiveBlogsInAdmin($page)
{

    $table = $this->db->table('zd_blogs');
    $table->select('*');
    $table->join('zd_main_cats', 'zd_main_cats.main_cat_id = zd_blogs.blog_main_cat', 'left');
    $table->join('zd_users', 'zd_users.user_id = zd_blogs.blog_user', 'left');
    $table->where('zd_blogs.blog_status', 1);
    $table->where('zd_blogs.blog_deleted', 0);
    $table->orderBy('zd_blogs.blog_id', 'DESC');
    $table->limit(5, $page);
    $query = $table->get();
    if($table->countAllResults() > 0)
    {
        return $query->getResult();
    }
    else
    {
        return FALSE;
    }
} 

如果有人能善待我,我將不勝感激

不知道您是否已經找到解決方案,但是您可以執行以下操作(對於 CI4)

在 controller 中執行以下操作..

$pager=service('pager); //instantiate pager..
$page=(int)(($this>request->getVar('page)!==null)?$this->request->getVar('page'):1)-1; //limit  ie ?page=1 would be set to page=0;
$perPage =  5; //offset
$total = $blog->getActiveBlogTotal();
$pager->makeLinks($page,$perPage,$total);
$data['pager'] = $pager;

在 model 中修改 function 如下

public function getActiveBlogsInAdmin($page=0,$perPage=1000) and..

$table->limit($page, $perPage);

在視圖中添加

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

編輯:剛剛注意到您曾經提到您正在使用構建器,在這種情況下您可以刪除

$table->limit($page,$perPage)

並使用

$query = $builder->get($page, $perPage); 

即限制和偏移量。

看來你在這里混淆了。 使用 function getActiveBlogsInAdmin()中的 LIMIT 子句,您的數據庫查詢被限制為 5 個結果。 因此,您將始終將當前的分頁設置為一頁。

您需要返回完整的數據集,因此 Pager class 可以渲染 First/Last/etc。 頁面鏈接。

刪除該行: $table->limit(5, $page);

我也有同樣的問題。 但我嘗試修改它並且它工作正常。 你可以試試這個

  • Model
    <?php

      namespace App\Models\PersediaanBarang;
    
      use CodeIgniter\Database\BaseBuilder;
      use CodeIgniter\Model;
    
      class M_pengadaan extends Model {

           // ...

            public function getData($per_page, $page, $filter) {

                  // Define builder
                  $builder = $this->db->table('t_req_pengadaan as TRP');
                  $builder->select('
                      TRP.*,
                      TL.nama_lab,
                      (SELECT COUNT(*) FROM t_req_pengadaan_detail TRPD WHERE TRPD.pengadaan_id = TRP.id) AS status_realisasi_wait,
                      (SELECT COUNT(*) FROM t_req_pengadaan_detail TRPD WHERE TRPD.pengadaan_id = TRP.id AND TRPD.status_realisasi = 2) AS status_realisasi_done
                   ', false);

                  $builder->join('t_lab as TL', 'TRP.lab_id = TL.id', 'LEFT');                

                  if (isset($filter['status_realisasi_src']) && $filter['status_realisasi_src'] != '') {
                      if ($filter['status_realisasi_src'] == 1) {
                          $builder->having('status_realisasi_done = status_realisasi_wait');
                      } else if ($filter['status_realisasi_src'] == 2) {
                          $builder->having('status_realisasi_done < status_realisasi_wait AND status_realisasi_done != 0');
                      } else if ($filter['status_realisasi_src'] == 3) {
                          $builder->having('status_realisasi_done = 0');
                      }
                  }                  

                  // Custom Pagination
                  if ($page != 1) {
                      $offset = (($page - 1) * $per_page);
                  } else {
                      $offset = $page - 1;
                  }
    
                  if ($per_page != -1) {
                      $data_get = $builder->get($per_page, $offset);
                  } else {
                      $data_get = $builder->get();
                  }
            
                  return $data_get->getResult('object');
            }

            public function getDataRows($filter) {
    
                  // Define builder
                  $builder = $this->db->table('t_req_pengadaan as TRP');
                  $builder->select('
                      TRP.*,
                      TL.nama_lab,
                      (SELECT COUNT(*) FROM t_req_pengadaan_detail TRPD WHERE TRPD.pengadaan_id = TRP.id) AS status_realisasi_wait,
                      (SELECT COUNT(*) FROM t_req_pengadaan_detail TRPD WHERE TRPD.pengadaan_id = TRP.id AND TRPD.status_realisasi = 2) AS status_realisasi_done
                   ', false);

                  $builder->join('t_lab as TL', 'TRP.lab_id = TL.id', 'LEFT');                

                  if (isset($filter['status_realisasi_src']) && $filter['status_realisasi_src'] != '') {
                      if ($filter['status_realisasi_src'] == 1) {
                          $builder->having('status_realisasi_done = status_realisasi_wait');
                      } else if ($filter['status_realisasi_src'] == 2) {
                          $builder->having('status_realisasi_done < status_realisasi_wait AND status_realisasi_done != 0');
                      } else if ($filter['status_realisasi_src'] == 3) {
                          $builder->having('status_realisasi_done = 0');
                      }
                  }    
            
                  return $builder->get()->getResult('object');
            }

      }

  • Controller

    <?php
    
       namespace App\Controllers\Transaksi\PersediaanBarang;
    
       use App\Controllers\BaseController;
       use App\Models\PersediaanBarang\M_pengadaan;

       class ControllerPengadaan extends BaseController {
           
           protected $m_pengadaan;
           protected $pager;

           public function __construct() {
             
              $this->m_pengadaan = new M_pengadaan();
              $this->pager = \Config\Services::pager();

          }

          public function index() {

                // Pagination
                $per_page = 10;
    
                if (isset($_GET['page_custom']) && $_GET['page_custom'] != "") {
                    $page = ($_GET['page_custom']);
                } else {
                    $page = 1;
                }
    
                // Passing data to View
                $data['onLaporan'] = $this->m_pengadaan->getData($per_page, $page, $_GET);
                
                $total_rows = count($this->m_pengadaan->getDataRows($_GET));
                $data['pagination'] = $this->pager->makeLinks($page, $per_page, $total_rows);

                echo view('transaksi/persediaan_barang/pengadaan/v_index', $data);
          }

       }

我希望你對我的簡單代碼有所幫助。

我最近開始使用 codeigniter 4 並面臨同樣的問題。 我已經按照Jason JM的代碼來解決這個問題。 這是我的代碼:

Controller:-

$myModel = new MyModel();
$contest_images = $myModel->my_method_name();

$pager=service('pager');
$page=(int)(($this->request->getVar('page')!==null)?$this->request->getVar('page'):1)-1;
$perPage =  12;
$total = count($contest_images);
$pager->makeLinks($page+1, $perPage, $total);
$offset = $page * $perPage;
$data['result'] = $myModel->my_method_name($perPage, $offset);

Model:-

public function my_method_name($perPage = null, $offset = null){
    $builder = $this->db->table("my_db_table");
    return $builder
        ->select()
        ->join('db_table_two','db_table_two.table_two_id = my_db_table.table_id')
        ->limit($perPage, $offset)
        ->get()
        ->getResult();
}

查看(分頁代碼):-

<?php $pager = \Config\Services::pager(); ?>
<?php if ($pager):?>
    <?php $pagi_path = 'my_controller/my_model'; ?>
    <?php $pager->setPath($pagi_path); ?>
    <?= $pager->links(); ?>
<?php endif; ?>

Controller:

$blog = new BlogModel();

    //* Retrieve blogs
    $segment = route_to('adminBlogPost', 'active');

    $blogs = $blog->getActiveBlogsInAdmin($perPage);
    $pager = $blog->pager;
    return $this->smarty->view('blog/active.tpl', compact(
        'blogs',
        'pager'
    )); 

Model:

public function getActiveBlogsInAdmin($perPage=10)
{
    return $this->asArray()
        ->select('*')
        ->join('zd_main_cats', 'zd_main_cats.main_cat_id = zd_blogs.blog_main_cat', 'left')
        ->join('zd_users', 'zd_users.user_id = zd_blogs.blog_user', 'left')
        ->where('zd_blogs.blog_status', 1)
        ->where('zd_blogs.blog_deleted', 0)
        ->orderBy('zd_blogs.blog_id', 'DESC')
        ->pageinate($perPage);
}

使用 CI 4.1.5 和 PHP 7.4.9,我嘗試了一切來完成這項工作,我可以在網上找到或想到只是嘗試隨機的東西。 事實證明,您只需像任何簡單的查找一樣在 Model 上鏈接查詢構建器方法。 然后內置的分頁效果非常好。

我確實在尋找這個,但除了錯誤的答案之外什么也沒找到。 然而,分頁是 Model 的一部分,所以這很有意義。 它需要張貼。 祝需要這個的人好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM