iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 10
0
自我挑戰組

自學CodeIgniter跌跌撞撞30天系列 第 10

[ Day 10 ] CodeIgniter第二個手作:番外篇(3):Active Record—— WHERE條件式

WHERE條件式&AND條件串接

簡單條件(=)

顧名思義是很簡單又很單純的條件,例如「我要找出名字為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); 

我學到這邊也覺得滿特別的,非常的彈性。

用陣列(array)表示簡單&自訂條件

假設~我要找會員資料,知道他是一位叫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呈現方式。

完全自訂WHERE語法

呈現方式就是大家最熟知的SQL語法:

$where = "name='Joe' AND status='boss' OR status='active'";
$this->db->where($where);

IN

where_in()

「我要Frank、Todd、James三位同學的成績」這情境~條件沒有一個區間範圍(例如大於三,小於六),這時候要下甚麼條件?當然是IN囉!雖然大家已不陌生,但請容我叨叨絮絮一番。

WHERE username IN ('Frank', 'Todd', 'James')
$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);

where_not_in()

「我要“除了”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);

LIKE

這大概是使用資料庫的朋友們最愛的東西了,啊?你不是?別拆我台嘛,至少我是啊(自言自語)

簡單值

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_like

加了一個not就是語意上反過來的意思,也就是「所有不含match的資料」。

WHERE title NOT LIKE '%match%
$this->db->not_like('title', 'match');

OR條件串接

or_where()

當條件式多個時,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_where_in()

從函數上看也很好認,用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_where_not_in()

例子文章上方(寶劍?)也有,也是加上OR,這裡就不多做解釋了~

OR username NOT IN ('Frank', 'Todd', 'James')
$names = array('Frank', 'Todd', 'James');
$this->db->or_where_not_in('username', $names);

or_like()

用OR串接的LIKE條件式,CI函數用or_like()。

OR title LIKE '%match%'
$this->db->or_like('title', 'match'); 

or_not_like()

用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的番外篇去。謝謝大家!


上一篇
[ Day 9 ] CodeIgniter第二個手作:番外篇(2):Active Record——select() 、 from()、join()
下一篇
[ Day 11 ] 斷賽&休刊,1/3回來。
系列文
自學CodeIgniter跌跌撞撞30天12

尚未有邦友留言

立即登入留言