在Codeigniter中使用LIMIT和OFFSET选择

k4emjkb1  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(75)

我在Codeigniter中开发了一个网站,在我的模型中,我有一个这样的函数:

public function nationList($limit = null, $start = null)
{
    if ($this->session->userdata('language') == "it") {
        $this->db->select('nation.id, nation.name_it as name');
    }
    if ($this->session->userdata('language') == "en") {
        $this->db->select('nation.id, nation.name_en as name');
    }
    $this->db->from('nation');
    $this->db->order_by("name", "asc");
    $this->db->limit($limit, $start);
    $query = $this->db->get();
    $nation = array();
    foreach ($query->result() as $row) {
        array_push($nation, $row);
    }
    return $nation;     
}

字符串
如果在我的控制器中,我调用函数而没有限制,start不会返回这样的结果:

$data["nationlist"] = $this->Nation_model->nationList();


相反,如果我设置limit和start工作!如果limit和start为null,为什么不返回结果?如果limit和start为null,我不想创建第二个函数或控件。当limit和start为null时,我如何解决这个问题?没有控件或第二个函数,使代码更有用,更有效?

vwhgwdsa

vwhgwdsa1#

试试这个...

function nationList($limit=null, $start=null) {
    if ($this->session->userdata('language') == "it") {
        $this->db->select('nation.id, nation.name_it as name');
    }

    if ($this->session->userdata('language') == "en") {
        $this->db->select('nation.id, nation.name_en as name');
    }

    $this->db->from('nation');
    $this->db->order_by("name", "asc");

    if ($limit != '' && $start != '') {
       $this->db->limit($limit, $start);
    }
    $query  = $this->db->get();

    $nation = array();
    foreach ($query->result() as $row) {
        array_push($nation, $row);
    }

    return $nation;     
}

字符串

hjzp0vay

hjzp0vay2#

更多访客:

// Executes: SELECT * FROM mytable LIMIT 10 OFFSET 20
// get([$table = ''[, $limit = NULL[, $offset = NULL]]])
$query = $this->db->get('mytable', 10, 20);

// get_where sample, 
$query = $this->db->get_where('mytable', array('id' => $id), 10, 20);

// Produces: LIMIT 10
$this->db->limit(10);  

// Produces: LIMIT 10 OFFSET 20
// limit($value[, $offset = 0])
$this->db->limit(10, 20);

字符串

7rtdyuoh

7rtdyuoh3#

我不知道你在2013年使用的是什么版本的CI,但我使用的是CI 3,我刚刚测试了两个null参数传递给limit(),在呈现的查询中没有LIMITOFFSET(我使用get_compiled_select()检查)。
这意味着--假设你已经正确地发布了你的编码尝试--你不需要改变任何东西(或者至少旧的问题不再是CI问题)。
如果这是我的项目,这就是我将如何编写方法以返回对象的索引数组或空数组(如果结果集中没有符合条件的行)。

function nationList($limit = null, $start = null) {
    // assuming the language value is sanitized/validated/whitelisted
    return $this->db
        ->select('nation.id, nation.name_' . $this->session->userdata('language') . ' AS name')
        ->from('nation')
        ->order_by("name")
        ->limit($limit, $start)
        ->get()
        ->result();
}

字符串
这些改进删除了不必要的语法、条件和冗余循环。
以下是CI核心代码,供参考:

/**
 * LIMIT
 *
 * @param   int $value  LIMIT value
 * @param   int $offset OFFSET value
 * @return  CI_DB_query_builder
 */
public function limit($value, $offset = 0)
{
    is_null($value) OR $this->qb_limit = (int) $value;
    empty($offset) OR $this->qb_offset = (int) $offset;

    return $this;
}


因此$this->qb_limit$this->qb_offset类对象不会更新,因为null在馈送到is_null()empty()时计算为true

相关问题