CodeIgniter框架常用——持续更新

Model查询构造器

查询:

public function book_detail($book_id)
{
        $where = array();
        if( ! empty($book_id))
        {
           $where = array('book_id'=>$book_id);
        }
        $result = $this->db->get_where(self::TABLE,$where)->result_array(); //或者row_array()返回一行记录的一维数组
        return $result;
}



public function getCourseList($id,$limitBegin = 0,$limitCount = 0){
        
        $order = 'add_time desc';
        $where = array(
            'at.id' => $uid,
            'at.status' => 1 
        );
        $this->db->select('
            at.id subject_id,
            bt.id user_id,
            (select title from wx_course wc where wc.id = at.course_id) course_name,  
        ',false);  //第二个参数可选,如果设置为 FALSE,CodeIgniter 将不保护你的 表名和字段名,这在当你编写复合查询语句时很有用,不会破坏你编写的语句。@城市之雾
        $this->db->from('a_table at');
        $this->db->join('b_table bt','at.hello_id = bt.id');

        $result = $this->db->where($where)->limit($limitCount,$limitBegin)->get()->result_array();
        return $result;
}

where

where('原生写法')
where(数组)
get_where('表名',数组或原生)
where_in('字段',要in的数组)

order by

//传递两个参数的写法
$this->db->order_by('title', 'DESC'); 
$this->db->order_by('name', 'ASC');
//或者直接使用原生
$this->db->order_by('title DESC, name ASC');

order by还可以随机排序(这样就不用在程序中使用suffle()函数对数组进行随机排序了) 

$this->db->order_by('title', 'RANDOM'); //第一个参数会被忽略,但是你可以传入一个 数字值,作为随机数的 seed。比如下面这种写法
$this->db->order_by(42, 'RANDOM'); //相当于原生的order by rand(42)

但是这种方法对于大数据量的话效率很低,一般数据量超过1万就不建议这么使用,可以参考下面这两篇文章优化随机取数据

https://blog.csdn.net/fdipzone/article/details/51541729

http://www.piaoyi.org/php/MySQL-Order-By-Rand.html

limit

$this->db->limit(10); //从第1条开始,查询10行。相当于原生的limit 10
$this->db->limit(10, 20);  //从第20条记录开始,查询10行。相当于原生的limit 20,10

like

$this->db->like('title', '演员的自我修养');  //相当于WHERE `title` LIKE '%演员的自我修养%' ESCAPE '!'
$this->db->like('title', '演员的自我修养', 'both');  // 前后都有百分号,默认不写第三个参数就是both
$this->db->like('title', '演员的自我修养', 'before');    // 百分号在前面
$this->db->like('title', '演员的自我修养', 'after'); // 百分号在后面

查询结果的展示形式

返回二维数组:result_array();  用法举例:

$this->db->get(self::TABLE)->result_array();

返回第一条记录(一维数组):

$this->db->get(self::TABLE)->row_array();

返回一个单一的值(比如通过一个id查询username):

CodeIgniter自带的函数中没有太好的方法,只能自己根据实际情况对查询结果进行修改,比如:

$result = $this->db->select('username')->where(array('id'=>$id))->get(self::TABLE)->row_array();
if(!empty($result)){
   return $result['username'];
}else{
   return '';
}

返回行数count(一般用于分页等):使用count_all_results()

 $result = $this->db->where("age > 1 and age < 15")->count_all_results(self::TABLE,FALSE); //第二个参数是FALSE,没理解官网说的重置select中设置的值是什么意思
 $result = $this->db->where("age > 1 and age < 15")->get(self::TABLE)->count_all_results(); //这种写法也可以


//当然也可以自己构造,不使用官方的方法@城市之雾
$result = $this->db->select('count(1) countAs')->where("age > 1 and age < 15")->get(self::TABLE)->row_array();
return $result['countAs'];

插入:

public function setExample(array $data){
        if(empty($data)){
           return 0;
        }
        $data['status'] = 1;
        $data['add_time'] = time();
        $data['edit_time'] = time();

        $this->db->insert('a_table', $data);
        return $this->db->insert_id();  //返回自增id
}

//-----------------或者使用set()方法进行设置


public function setExample(array $data){
        if(empty($data)){
           return 0;
        }
        $data['status'] = 1;
        $data['add_time'] = time();
        $data['edit_time'] = time();

        $this->db->set($array);  //直接set一个数组。当然也可以一个值一个值的set,比如$this->db->set('name', $name);
        $this->db->insert('a_table');
        return $this->db->insert_id();  //返回自增id
}

更新:

public function setExample(array $data){
        /*
          data样例:
          $data = array(
          'title' => $title,
          'name' => $name,
          'date' => $date
          );
        */

        if(empty($data)){
           return 0;
        }
        $data['edit_time'] = time();
        $this->db->where('id', $id);
        $result = $this->db->update('mytable', $data);
        return $result;
}

//-----------------或者使用set()方法进行设置

public function setExample(array $data){
        /*
          data样例:
          $data = array(
          'title' => $title,
          'name' => $name,
          'date' => $date
          );
        */

        if(empty($data)){
           return 0;
        }
        
        $this->db->set('edit_time', time());  //设置逐个设置值
        $this->db->set($data);  //设置数组

        $this->db->where('id', $id);
        $result = $this->db->update('mytable');
        return $result;
}



//特别说明,如果要set的不是字符串,而是需要进行运算的,则set的第三个参数设置为FALSE即可,数据将不会自动转义。下面比较一下:

$this->db->set('field', 'field+1', FALSE);
$this->db->where('id', 2);
$this->db->update('mytable'); // 相当于原生的: UPDATE mytable SET field = field+1 WHERE id = 2


$this->db->set('field', 'field+1');
$this->db->where('id', 2);
$this->db->update('mytable'); // 相当于原生的: UPDATE `mytable` SET `field` = 'field+1' WHERE `id` = 2

删除:

$this->db->where('id', $id);
$this->db->delete('mytable');

//不过这种删除方法不常用,现在流行的都是假删除,就是更新记录的状态,status = 0之类的

查询最后执行的sql语句:

echo $this->db->last_query();

加载数据库类和session类

在application/config/autoload.php中
$autoload['libraries'] = array('database','session');

或者在基控制器中加载$this->load->database();

-----------------------------------------------------------------------------------------------------------------------------------------------

常见错误:

忘记引入model时报错
Call to a member function getTeam() on null

在构造函数中引入即可:$this->load->model('xxx_model');

URL引入错误

config中的base_url要写完整访问地址,不能光写域名。正确写法:

$config['base_url'] = 'http://www.xxxx.com';

 

猜你喜欢

转载自my.oschina.net/u/3477605/blog/1816618