【问题标题】:issue with pagination and limit分页和限制问题
【发布时间】:2012-02-01 06:18:51
【问题描述】:

我有 3 个表 site_settings、sermons & Preachers。在 site_settings 表中,设置要显示的最大传教士数量。 Preacher 表包含所有传教士的详细信息,而 sermons 表包含所有传教士的讲道。我正在使用分页来显示传教士(2/页)。如果 site_settings 表的值为 1 或 2 则没有传教士将显示 2,如果 3 或 4 则传教士 4... 我不知道发生了什么。是分页问题还是限制问题?我为此使用以下代码(在模型中)

模型中的方法

function viewAll($offset=0, $limit=null) {

        $this->db->select('settings_value');
        $this->db->from('site_settings');
        $this->db->where('settings_name', 'preachercount');
        $count = $this->db->get()->row();
        echo $count->settings_value;

        $preacher = array();
        $this->db->select('preacher.preacher_id,preacher.first_name,preacher.last_name,preacher.preacher_image,preacher.preacher_logo,preacher.preacher_bio_brief');
        $this->db->distinct('preacher.preacher_id');
        $this->db->from('preacher');
        $this->db->join('sermons', 'sermons.preacher_id=preacher.preacher_id');
        $this->db->order_by('preacher.sort_order');
        $this->db->limit($count->settings_value);
        $query = $this->db->get('', $limit, $offset);
        if ($query->num_rows() > 0) {

            foreach ($query->result() as $row) {
                $preacher[$row->preacher_id]['preacher_id'] = $row->preacher_id;
                $preacher[$row->preacher_id]['preacher_name'] = $row->first_name . ' ' . $row->last_name;
                $preacher[$row->preacher_id]['preacher_image'] = $row->preacher_image;
                $preacher[$row->preacher_id]['preacher_logo'] = $row->preacher_logo;
                $preacher[$row->preacher_id]['preacher_bio_brief'] = $row->preacher_bio_brief;

                $this->db->select('*');
                $this->db->from('sermons');
                $this->db->where('preacher_id', $row->preacher_id);
                $this->db->order_by('sort_order ');
                $sermon_array = array();

                $query = $this->db->get();
                if ($query->num_rows() > 0) {
                    foreach ($query->result() as $row1) {
                        $sermon_array[$row1->sermon_id] ['sermon_image'] = $row1->sermon_image;
                        $sermon_array[$row1->sermon_id] ['sermon_title'] = $row1->sermon_title;
                        $sermon_array[$row1->sermon_id] ['audio_file'] = $row1->audio_file;
                        $sermon_array[$row1->sermon_id] ['sermon_description'] = $row1->sermon_description;
                    }
                }
                $preacher[$row->preacher_id]['sermon'] = $sermon_array;
            }
            return $preacher;
        }
        return false;
    }

控制器中的方法

function list() {

        $paginate_segment = $this->uri->segment(3) ? $this->uri->segment(3) : 0;
        $winner_list = $this->sermon_model->viewAllpreachers(0, null);
        $config['base_url'] = base_url() . 'sermons/index/';
        $config['total_rows'] = ($winner_list) ? count($winner_list) : 0;
        $config['per_page'] = 2;
        $config['full_tag_open'] = '';
        $config['full_tag_close'] = '';
        $config['uri_segment'] = 3;
        $config['num_links'] = 4;
        $config['display_pages'] = TRUE;
        $config['first_link'] = 'First';
        $config['first_link'] = 'First';
        $config['first_tag_open'] = '<div>';
        $config['first_tag_close'] = '</div>';
        $config['last_link'] = 'Last';
        $config['next_link'] = 'Next';
        $config['prev_link'] = 'Prev';
        $config['cur_tag_close'] = ' | ';
        $config['num_tag_close'] = ' | ';

        //initialize pagination
        $this->pagination->initialize($config);
        $this->data['preachers'] = $this->sermon_model->viewAllpreachers($paginate_segment, $config['per_page']);
        $this->data['links'] = $this->pagination->create_links();
        $this->data['page'] = $this->config->item('APP_template_dir') . 'site/home/sermons_view';
        $this->load->vars($this->data);
        $this->load->view($this->_container);
    }

【问题讨论】:

  • 你限制了两次。如果 $limit 未作为参数传递,您是否要“回退”到设置表?
  • 我没听懂你……你能解释一下吗
  • 您通过 1) 显式调用 $this->db->limit() 以及 2) $this->db 的 $limit 和 $offset 参数来限制结果->获取()。我的猜测是您将 NULL 作为 $limit 值传递,我不知道 CI 对此做了什么。
  • 执行该功能后,我得到了以下查询。选择DISTINCT preacher 987654324 @,preacher 987654326 preacher 987654327 last_namepreacher 987654331 preacher 987654333 preacher 987654334 preacher 987654334 (preacher) 加入sermons ON sermons.preacher_id=preacher.preacher_id ORDER BY preacher.sort_order LIMIT 7
  • 第一个限制是分页 $limit=null

标签: codeigniter pagination limit


【解决方案1】:

如 cmets 所述,您使用了两次限制,需要结合这些方法:

function viewAll($offset=0, $limit=null) {

    $this->db->select('settings_value');
    $this->db->from('site_settings');
    $this->db->where('settings_name', 'preachercount');
    $count = $this->db->get()->row();

    // now use value of [$count] if [$limit] is null - else use [$limit]
    $limit = (is_null($limit)) ? $count : $limit ;

    $preacher = array();
    $this->db->select('...');
    $this->db->distinct('preacher.preacher_id');
    $this->db->from('preacher');
    $this->db->join('sermons', 'sermons.preacher_id=preacher.preacher_id');
    $this->db->order_by('preacher.sort_order');
    // then remove the [limit()] call
    // $this->db->limit($count->settings_value); <-- NOT NEEDED
    $query = $this->db->get('', $limit, $offset);

这有效地允许您将$limit 传递给方法,或使用数据库中的设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    相关资源
    最近更新 更多