顧名思義是很簡單又很單純的條件,例如「我要找出名字為Joe」的資料,此時希望的WHERE條件會長這樣:
WHERE name = 'Joe'
用CI的表達方式:
$name = 'joe';
$this->db->where('name', $name);
當多個條件的時候,CI會將每個條件串上AND,因為我不是在分享邏輯課,所以我不會特別去解釋OR、AND⋯⋯之類的細節,我也相信~已經在學framework的你已經會邏輯符號了!
我們把簡單的條件再進階一點點:「我要找名字不為joe」而且「ID比45小」的人。這時候,WHERE的條件會這樣呈現:
WHERE name != 'Joe' AND id < 45
用CI的表達方式:
$name = 'Joe';
$id = 45;
$this->db->where('name !=', $name);
$this->db->where('id <', $id);
我學到這邊也覺得滿特別的,非常的彈性。
假設~我要找會員資料,知道他是一位叫Joe的老闆,而且帳號是活躍狀態的,那我條件就會這樣下:
WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
CI的array表達方式:
$name = 'Joe';
$title = 'boss';
$status = 'active';
$array = array('name' => $name, 'title' => $title, 'status' => $status);
$this->db->where($array);
自訂條件要怎麼用array呈現呢?這邊就不做情境假設了,直接看他的format就好:
$array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);
$this->db->where($array);
用PDO方式很習慣的朋友應該會比較習慣array呈現方式。
呈現方式就是大家最熟知的SQL語法:
$where = "name='Joe' AND status='boss' OR status='active'";
$this->db->where($where);
「我要Frank、Todd、James三位同學的成績」這情境~條件沒有一個區間範圍(例如大於三,小於六),這時候要下甚麼條件?當然是IN囉!雖然大家已不陌生,但請容我叨叨絮絮一番。
WHERE username IN ('Frank', 'Todd', 'James')
$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);
「我要“除了”Frank、Todd、James三位同學的成績」,是排除那三者的全部資料都要。與SQL語法加個NOT一樣,只需要在CI的函數名稱上加個not就可以了!
WHERE username NOT IN ('Frank', 'Todd', 'James')
$names = array('Frank', 'Todd', 'James');
$this->db->where_not_in('username', $names);
這大概是使用資料庫的朋友們最愛的東西了,啊?你不是?別拆我台嘛,至少我是啊(自言自語)
CI函數的預設,前後會加上萬用字元(%),不知道什麼是%?你要先去看資料庫相關文章才行唷!
WHERE title LIKE '%match%'
$this->db->like('title', 'match');
//前:%match
$this->db->like('title', 'match', 'before');
//後:match%
$this->db->like('title', 'match', 'after');
//前+後:%match%
$this->db->like('title', 'match', 'both');
//無:match
$this->db->like('title', 'match', 'none');
加了一個not就是語意上反過來的意思,也就是「所有不含match的資料」。
WHERE title NOT LIKE '%match%
$this->db->not_like('title', 'match');
當條件式多個時,CI會以AND把條件串起來,想改用OR串條件,就靠or_where()了!代碼如下:
WHERE name != 'Joe' OR id > 50
用CI的表達方式:
$name = 'Joe';
$id = 50;
$this->db->where('name !=', $name);
$this->db->or_where('id >', $id);
從函數上看也很好認,用OR串接的IN條件。這例子前面已經提過了,差別在於OR用在前面已有條件的狀況下,達成這個條件也算成立,用法很簡單,把CI函數的部分改為or_where_in()就可以了:
OR username IN ('Frank', 'Todd', 'James')
$names = array('Frank', 'Todd', 'James');
$this->db->or_where_in('username', $names);
例子文章上方(寶劍?)也有,也是加上OR,這裡就不多做解釋了~
OR username NOT IN ('Frank', 'Todd', 'James')
$names = array('Frank', 'Todd', 'James');
$this->db->or_where_not_in('username', $names);
用OR串接的LIKE條件式,CI函數用or_like()。
OR title LIKE '%match%'
$this->db->or_like('title', 'match');
用OR串接的NOT LIKE條件式,or_not_like()。
OR title NOT LIKE '%match%'
$this->db->or_not_like('title', 'match');
今天在這裡把WHERE給END了,但是我必須說~還是有一些常用的東西沒提到:group by 、having、distinct,我不認為這是Where主題要說的,我會再把它安排到Selecting的番外篇去。謝謝大家!