Day17-從基礎學習 ThinkPHP-資料操作(2)

前言

前一篇的資料操作我們使用原生 SQL 指令來撰寫資料操作,那麼這一篇呢?這一篇我們將會使用 ThinkPHP 所提供的功能,也就是構造器來進行資料操作。

構造器

我不清楚為什麼官方會翻譯成構造器,但是簡單來講 ThinkPHP 提供一些包裝好的 SQL 指令方法,最主要可以方便我們做資料操作,而這資料操作是基於 PDO 參數綁定,PDO 可以保護系統被 SQL 注入,所以我們可以不用去撰寫特殊字符轉譯。

SQL 注入可以參考我另一篇寫的文章介紹,可能不是講得非常好,但是有一些小範例可以參考:這是在講關於一名叫 Koa 的全端勇士傳說-MySQL篇-SQL injection

撰寫方式

由於我這邊也是希望可以保留寫法,所以一樣會在 dbexample 控制器下撰寫,但使用構造器撰寫的方法我通通會加上一個前綴詞,也就是 sqlXxx,例如新增的方法就是 sqlAdd 以此類推。

新增資料

構造器的寫法非常簡潔,讓我們先從新增的寫法吧!

1
Db::table('think_db')->insert(['name'=>'陳春嬌']);

這樣子一個基礎的新增方法,我們就完成了,讓我們稍微比較一下原生 SQL 寫法以及構造器語法,下方這個是原生 SQL 語法:

1
2
$result = Db::execute('INSERT INTO think_db (name) VALUE ("王大明")');
dump($result);

而下方這個是透過 ThinkPHP 所提供的構造器寫法:

1
Db::table('think_db')->insert(['name'=>'陳春嬌']);

相較之下語法簡潔非常多,只是多了必須指定資料表名稱,否則 ThinkPHP 不知道你要將資料新增到哪裡。

更新資料

更新的語法呢?其實也很簡單,但是會帶上一個 where ,也就是條件來判定要更新哪一筆資料:

1
Db::table('think_db')->where('name','陳春嬌')->updata(['name'=>'陳秋嬌']);

請注意要先 where 之後再 updata,否則可是會出現錯誤的唷。

查詢資料

查詢的方法可以分為查詢全部以及單一查詢,那麼我先寫查詢全部的方法:

1
Db::table('think_db')->select(); // 超簡短(?!)

那單一查詢呢?一樣是搭配上 where 來做查詢:

1
Db::table('think_db')->where('name','陳秋嬌')->select(); // 還是非常簡短(?!)

我們也可以回顧一下前一篇我們所撰寫的單一查詢原生 SQL 語法:

1
2
$result = Db::query('SELECT * FROM think_db WHERE name="QQ 先生"');
dump($result);

可以發現透過構造器撰寫的資料操作是真的簡易非常多,但是對於基礎的 SQL 語法是必須理解,否則你會覺得很像在變魔術。

刪除資料

相信聰明的你經過上面的洗鍊就會知道該怎麼寫刪除語法,在刪除資料之前一定要先使用條件篩選來刪除資料,然後在執行刪除動作,否則可是發生悲劇的:

1
Db::table('think_db')->where('name','陳秋嬌')->delete();

簡化語法

另外我們還可以將指定資料表的 table 語法簡寫,可以不用帶入 think_,而是透過設置 (database.php) 幫我們自己帶入前綴詞也這樣也是可以的:

1
2
3
4
5
Db::table('db')->insert(['name'=>'陳春嬌']);
Db::table('db')->where('name','陳春嬌')->updata(['name'=>'陳秋嬌']);
Db::table('db')->select();
Db::table('db')->where('name','陳秋嬌')->select();
Db::table('db')->where('name','陳秋嬌')->delete();

好處是當資料表修改名稱時,我們就不用再來調整這些區塊,但我個人是比較習慣寫入前綴詞。

當然我們這邊還可以進一步簡化程式碼,例如不要每一行都寫 table('db'),所以可以這樣簡寫:

1
2
$db = db('db');
$db->insert(['name'=>'陳春嬌']);

最後簡寫之後的完整程式碼就會像這樣這麼簡潔:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public function sqlAdd()
{
$db = db('db');
$db->insert(['name'=>'陳春嬌']);
}
public function sqlUpdata()
{
$db = db('db');
$db->where('name','陳春嬌')->updata(['name'=>'陳秋嬌']);
}
public function sqlSelect()
{
$db = db('db');
$db->where('name','陳秋嬌')->select();
}
public function sqlDelete()
{
$db = db('db');
$db->where('name','陳秋嬌')->delete();
}

其他方法

最後 ThinkPHP 還提供其他的構造器方法,而且你可以使用鏈式寫法一直串接下去進而達到更複雜的資料操作行為,例如:

1
2
$db = db('db');
$db->order('id','desc')->limit('2')->select(); // 遞減排序,並且限制查詢筆數在兩筆

通常比較常見的方法是 order()limit() 這兩個,當然還有其他方法可以使用,建議詳見官方開發手冊

結尾

最後我這邊並沒有講到路由註冊,因為前面已經講很多次,所以這邊就不再多講該怎麼設置,後面預計將會拉回 Model 基礎操作 系列,畢竟我們已經知道該如何使用原生 SQL 指令 & 構造器來做資料操作,其中構造器在後面我們會很常使用到。