如何在组合来自两个不同查询的数据时创建分页链接

时间:2013-02-17 23:47:16

标签: php codeigniter

我有一个控制器,其方法看起来像这样:

    public function browsecategory($category_id)
    {               

        //find any subcategories for this category
        $this->load->model('category/category_model');
                    $this->load->model('category/product_category_model');  
        $records['categories'] = $this->category_model->find_all_by('parent_id', $category_id);

                    //add some product data too. 
                    $records['products'] = $this->product_category_model->find_all_by('category_id', $category_id); 
        Template::set('records', $records);
        Template::render();
    }//end browsecategory

我在codeigniter分页“stuff”中看到的所有示例都使用了一个查询。 我需要组合两个数据集并在一个视图上提供服务。

有什么建议吗?

编辑1

我试图遵循MDeSilva的建议如下。虽然分页对象正确计算要创建的链接数,但所有项都显示在所有页面上。

以下是获取数据的模型中的代码:

public function get_categories_and_products($limit=12, $offset=0, $category_id=null)
{
    print '<BR>the function got the following offeset:'.$offset;
    $query = "(SELECT cat.category_id, cat.title, cat.image_thumb, cat.deleted, cat.display_weight ";
    $query = $query."FROM bf_categories cat ";
    $query = $query."WHERE cat.parent_id=".$category_id;
    $query = $query." AND cat.category_id <>".$category_id;
    $query = $query.") UNION (";
    $query = $query."SELECT p.product_id, p.name, p.image_thumb, p.deleted , p.display_weight";
    $query = $query." FROM bf_product p ";
    $query = $query."Inner join bf_product_category cp ";
    $query = $query."on p.product_id=cp.product_id ";
    $query = $query."Where cp.category_id=".$category_id.")";

    $this->db->limit($limit, $offset);
    $catsandprods= $this->db->query($query);
    return $catsandprods->result() ;
}

这是控制器中的代码:

public function browsecategory($category_id, $offset=0)
    {
            $this->load->library('pagination');

            $total = $this->product_model->get_cats_prods_count($category_id);

            $config['base_url'] = site_url('/product/browsecategory/'.$category_id);
            $config['uri_segment'] = 4;
            $config['total_rows'] = $total;
            $config['per_page'] = 5;
            $config['num_links'] = 10;

            $this->pagination->initialize($config);
            $offset = ($this->uri->segment($config['uri_segment'])) ? $this->uri->segment($config['uri_segment']) : 0;
                        print $offset;
            //Call the model function here to get the result, 
            $records= $this->product_model->get_categories_and_products(5,$offset,$category_id);
            //add to breadcrumb trail
            $this->build_bread_crumb_trail($category_id);
            $breadcrumbs = $this->breadcrumbs->expand_to_hyperlinks();

            Template::set('currentcategory',$category_id);
            Template::set('breadcrumbs', $breadcrumbs);
            Template::set('records', $records);
            Template::render();     
    }

我已经调试了,我可以看到代码行“$ this-&gt; db-&gt; limit($ limit,$ offset);”在模型中不起作用。它总是返回完整的记录集...... 你能告诉我我错过了什么吗? 谢谢。

3 个答案:

答案 0 :(得分:1)

这是在CI中生成分页链接的方法,因为您的要求有一个带连接的查询,

public function index($offset = 0) {
   $language_id = 1;

    $artwork_id = null;

    if ($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        $artwork_id = $this->input->post('serach_artwork_id', TRUE) ? $this->input->post('serach_artwork_id', TRUE) : null;
        $data['artwork_id'] = $artwork_id;

    }

    $this->load->library('pagination');
    $limit = 10;

    $total = $this->Artwork_model->get_artwork_count($language_id, $artwork_id);

    $config['base_url'] = base_url().'artwork/index/';
    $config['total_rows'] = $total;
    $config['per_page'] = $limit;
    $config['uri_segment'] = 3;

    $config['first_link'] = '<< First';
    $config['last_link'] = 'Last >>';
    $config['next_link'] = 'Next ' . '&gt;';
    $config['prev_link'] = '&lt;' . ' Previous';
    $config['num_tag_open'] = '<span class="number">';
    $config['num_tag_close'] = '</span>';

    $config['cur_tag_open'] = '<span class="current"><a href="#">';
    $config['cur_tag_close'] = '</a></span>';

    $this->pagination->initialize($config);

    //Call the model function here to get the result, 
    $data['artworks'] = $this->Artwork_model->get_artworks($language_id, $limit, $offset, $artwork_id);

    $this->template->write('title', 'Artwork : Manage Artwork');
    $this->template->write_view('content', 'artwork/index', $data);
    $this->template->render();
}

以下是模型中具有多个连接的查询的示例

public function get_artworks($language_id = 1, $limit = 10, $offset = 0, $arwork_id = null)
    {        
        $this->db->select('a.id, a.price, a.is_shop, at.title,at.status,at.date_added,ats.name as artist_name');
        $this->db->from('artworks a');
        $this->db->join('artwork_translations at', 'a.id = at.artwork_id');
        $this->db->join('artists ats', 'a.artist_id = ats.id');
        $this->db->where('at.language_id', $language_id);
        if(!is_null($arwork_id) && !empty($arwork_id) && $arwork_id != 'all')
        {
            $this->db->where('a.id =', $arwork_id);
        }
        $this->db->order_by('a.id DESC');
        $this->db->limit($limit, $offset);

        $artworks = $this->db->get();

        return $artworks->result();
    }

在视图中

<?= $this->pagination->create_links(); ?>

答案 1 :(得分:0)

分页类不关心数据源的构造方式,只是将它交给它想要的数据结果对象。所以你只要通过限制和放大抵消数据查询,或者拔出所有数据并在之后将其分割。

但是,我真的不明白你是如何考虑将这些不同的数据组合成一个结果来显示的 - 你试图显示所有类别,然后对产品进行分页吗?如果是这样,您设置不正确

答案 2 :(得分:0)

只需使用PHP函数array_merge

<?php $beginning = 'foo'; $end = array(1 => 'bar');
$result = array_merge((array)$beginning, (array)$end);
$this->load->view('view.php', $result);
?>

并根据所用数组的键提取。 这很简单&amp;工作