在Codeigniter中使用LIMIT进行SELECT

时间:2013-01-09 08:37:55

标签: php sql codeigniter

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

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为null,为什么不返回结果?如果limit和start为null,我不想创建第二个函数或控件。 如果在没有控件或第二个函数的情况下限制和启动为null以使代码变得有用并且效率更高,我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:22)

试试这个......

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;     
}

答案 1 :(得分:3)

对于更多访问者:

// 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);

答案 2 :(得分:0)

我不知道您在2013年使用的是哪个版本的CI,但我使用的是CI3,我只是将两个null参数传递给limit()进行了测试,但没有{{1 }}或LIMIT(在呈现的查询中(我使用OFFSET进行了检查)。

这意味着-假设您已正确发布了编码尝试-您无需进行任何更改(或至少旧问题不再是CI问题)。

如果这是我的项目,这就是我编写方法以返回对象的索引数组或如果结果集中没有合格行的情况下返回空数组的方法。

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();
}

因此/** * 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馈给nulltrue时,其评估为is_null()。 / p>