此文分為兩個單元
1 Select 的使用
2 builder class/Insert/Update,Delete和其他的使用。
Select使用Bulider Class(Query helper)
CI3 承襲 CI2,有很多的builder class可以用,依各人的使用習慣,有人喜歡一堆sql字串,有人喜歡用helper。以下範例產生的$q是查詢物件:
範例1 select uid, uname from user;
$q= $this->db->select('uid')->from('user')->get();
範例2 select count(uid) as cnt from user where state=1;
$q= $this->db->select('count(uid) as cnt')->from('user')->where('state',1)->get();
範例3 select role, rolename, priv from user_role where uid=1 left join auth_role on user_role.role= auth_role.roleID;
$q=$this->db->select("role, rolename, priv") ->from('user_role') ->where('uid', 1) ->join('auth_role', 'user_role.role= auth_role.roleID')->get();
範例4 select email from user where email like '%john%' order by uid limit 10;
$q= $this->db->select('`email`')->from("user")->like('email', 'john')->order_by('uid')->limit(10)->get();
範例5 select sum(`cnt`) from `counter` where module='index' and `dt`=subdate(current_date, 1) ;
$q=$this->db->select('sum(`cnt`)')->from('counter')->where('module','index')->where('dt', 'subdate(current_date, 1)',false)->get();
...更多使用方可 以參考 CI3官網
我的Select Builder使用原則:
1. 簡單的查詢用Builder,複雜的直接寫sql防止邏輯錯誤。
2. 物件方法叫用順序有差,應照語法順序來, 例如
->from()->where()->order_by()->limit ()
->from()->or_where(A)->where(B)->where(C) // where A and B and C 第一個or_where視同為 where
->from()->or_where(A)->or_where(B)->or_where(C) // where A or B or C
->from()->where(A)->or_where(B)->or_where(C) // where A or B or C
->from()->where(A)->or_where(B)->where(C) // where A or B and C,等於 A or (B and C)
->from()->where(A)->where(B)->or_where(C) // where A and B or C,等於 (A and B) or C
3. 善用get_compiled_select() (未查詢)或 last_query() (已查詢)去查看字串輸出是否正確:
$q= $this->db->select('uid')->from('user')->where('uid >',1)->or_where('state',2)->or_where('item',3);
//印出sql字串,本身這行並不會執行
print $q->get_compiled_select();
* 使用get_compiled_select 要注意不能先使用 get 方法,否則會錯誤
//如果已經有執行過查詢,則印出最後執行的sql字串
print $this->db->last_query();
* 使用 last_query 要注意在 config/database.php 中要把 'save_queries' 設為 true,才會有作用:
'save_queries' => true
like[3]
$this->db->like('body', 'match'); // `body` LIKE '%match%
$this->db->like('title', 'match', 'before'); // WHERE `title` LIKE '%match' ESCAPE '!'
$this->db->like('title', 'match', 'after'); // WHERE `title` LIKE 'match%' ESCAPE '!'
$this->db->like('title', 'match', 'both'); // WHERE `title` LIKE '%match%' ESCAPE '!'
Insert
法一,使用sql字串|
$sql = "insert into role(rolename, item) values ( 'role1', 1)";
$ok= $this->db->simple_query($sql); //成功回傳 true,否則 false
法二,使用陣列(推薦)
$ok= $this->db->insert('role', array('rolename'=>$rolename, 'item'=>1)); //成功回傳 true,否則 false
查錯或輔助
1. 查看新增資料的主鍵編號
$lastid= $this->db->insert_id();
2. 查看影響列數
$affn= $this->db->affected_rows();
3. 查看所下的指令字串(推薦)
$str = $this->db->last_query();
* 使用 last_query 要注意在 config/database.php 中要把 'save_queries' 設為 true,才會有作用:
'save_queries' => true
4. 使用 insert_string,這個指令並不會真正的執行insert,只是產生插入的SQL字串。
$data = array('name' => $name, 'email' => $email, 'url' => $url);
$str = $this->db->insert_string('table_name', $data);
Update
法一,使用sql字串|
$sql = "updaet role set rolename='role1', item=1 where sn =3";
$ok= $this->db->simple_query($sql); //成功回傳 true,否則 false
法二,使用陣列(推薦)
$row= array(''rolename'=>$rolename, 'item'=>1);
$ok= $this->db->where('sn', 3)->update( $row); //成功回傳 true,否則 false
查錯或輔助
1. 查看影響列數
$affn= $this->db->affected_rows();
2. 查看所下的指令字串(推薦)
$str = $this->db->last_query();
* 使用 last_query 要注意在 config/database.php 中要把 'save_queries' 設為 true,才會有作用:
'save_queries' => true
3. 使用 update_string,這個指令並不會真正的執行update,只是產生插入的SQL字串。
$data = array('name' => $name, 'email' => $email, 'url' => $url);
$where = "author_id = 1 AND status = 'active'";
$str = $this->db->update_string('table_name', $data, $where);
自己數值加減1的寫法
content點擊數加1 ,在set 的部分第三個參數要設為 false
$this->db->set('clicked', '`clicked`+1', false)->where('nID',20)->limit(1)->update('content');
Delete
使用delete函數
單筆刪除資料
$this->db->where('id', $id)->delete('mytable');
$this->db->delete('mytable', array('id' => 1));
刪除多表格資料
CI3可以快速刪除多個表格相同條件的資料,只要把表格名放到陣列即可:
$tables = array('table1', 'table2', 'table3');
$this->db->where('id', '5')->delete($tables);
清空表格
軟性作法,相當於 delete * from mytable;
$this->db->empty_table('mytable');
硬性作法,也會清除表格的計數器等資訊
$this->db->truncate('mytable');
刪除的筆數
$this->db->affected_rows();
參考資料
[1] CI3 DATABASE官網文件 Query Helper Methods
[2] Delete https://codeigniter.org.tw/userguide3/database/query_builder.html
[3] https://codeigniter.jp/user_guide/3/database/query_builder.html