Day16-從基礎學習 ThinkPHP-資料操作(1)

前言

看到這一篇想必你一定會覺得很茫然為什麼要突然從 Model 基礎操作跳到資料操作呢?主要原因是想讓你明白,其實也可以使用原生的寫法來操作資料,而且不需要透過 Model,那麼就讓我們一探究竟吧!

起手式

首先如果我們想要在 Controller 中操作 DB,那就必須引入 ThinkPHP 所提供的函式庫,否則是無法操控 DB 的:

1
use think\Db;

那麼由於為了避免搞混以及我個人想保留每一段我撰寫的程式碼,所以我另外建立的一個資料夾叫做 dbexample 並建立相關檔案,內容部分就不額外提供 ↓

資料夾

最主要的 Controller 初始內容會提供在這裡:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
namespace app\dbexample\controller;

use think\Controller;

use think\Db;

class Index extends Controller
{
public function index()
{
}
}

原生 SQL

接下來我們在前面有學過原生的 SQL 語法,首先先讓我們建立一個資料表叫 think_db

1
2
3
4
5
CREATE TABLE think_db (
id int(10) NOT NULL auto_increment,
name varchar(5) NOT NULL default '',
PRIMARY KEY (id)
) AUTO_INCREMENT=1;

那後面我們就可以開始準備在 Controller 中使用原生的語法,也就是新增、查詢、編輯、刪除等動作,但是這邊要注意一件事,我們將會透過剛剛引入的函式庫,也就是 Db 來撰寫原生 SQL 語法,基本語法是使用 Db::execute,除了查詢是使用 Db::query,其餘都是使用 Db::execute 的方式。

新增資料

使用的方式很簡單,只需要在 Db::execute('SQL 指令') 裡面寫入 SQL 指令就可以達到我們要的效果,這邊舉例新增資料:

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

最後請務必記得語法結束後,要補上 dump(),否則並不會執行你的 SQL 指令。

編輯資料

1
2
$result = Db::execute('UPDATE think_db SET name="QQ 先生"');
dump($result);

查詢資料

前面有講到唯獨查詢是使用 Db::query() 的方式,所以在撰寫上要稍微注意一下:

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

刪除資料

1
2
$result = Db::query('DELETE think_db SET name="QQ 先生"');
dump($result);

完整程式碼

那麼我們可以將上方新增、編輯、查詢以及刪除的 SQL 指令,個別包成一個 function,稍後透過路由來訪問 Controller 進而執行這些 SQL 指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public function add() 
{
$result = Db::execute('INSERT INTO think_db (name) VALUE ("王大明")');
dump($result);
}
public function update()
{
$result = Db::execute('UPDATE think_db SET name="QQ 先生" WHERE name="王大明"');
dump($result);
}
public function select()
{
$result = Db::query('SELECT * FROM think_db WHERE name="QQ 先生"');
dump($result);
}
public function delete()
{
$result = Db::execute('DELETE FROM think_db WHERE name="QQ 先生"');
dump($result);
}

Route

註冊路由的部分比較沒有什麼好講的,因為只是要作範例,所以我這邊一路都使用 get 來註冊路由:

1
2
3
4
Route::get('/dbexample/add', 'dbexample/index/add');
Route::get('/dbexample/update', 'dbexample/index/update');
Route::get('/dbexample/select', 'dbexample/index/select');
Route::get('/dbexample/delete', 'dbexample/index/delete');

接下來我會建議依照我建議的流程來瀏覽 URL,避免出現無法訪問之問題。

1
建議流程:add → updata → select → delete (否則可能出現錯誤)

那麼我這邊就只附上查詢的結果 ↓

使用 query 方法所查詢的結果會返回一個陣列

切換資料庫連接

當然你也可以透過 Db 中其中一個方法來切換資料庫連結,也就是 Db::connect([資料庫連接]),範例如下:

1
2
$result = Db::connect('mysql://root:123456@localhost:3306/ithelp')->query('SELECT * FROM think_db WHERE name="QQ 先生"');
dump($result);

但是這種方式並不是非常好,最主要會導致程式碼複雜並且難以維護,所以一般來講我們會在 application 底下增加一個檔案叫 config.php,並依照 project/config 底下的 database.php 內容當作範例,然後製作成一個陣列,並依照相關參數這樣傳入即可:

1
2
3
4
$result1 = Db::connect('qq1')->query('SELECT * FROM think_db WHERE name="QQ 先生"');
dump($result2);
$result2 = Db::connect('qq2')->query('SELECT * FROM think_db WHERE name="QQ 先生"');
dump($result2);

那麼這就是切換資料庫連接的方式,但是上方的範例我這邊就不實作,因為這種方式我實際上並沒有開發以及使用過,而且也比較少遇到這種狀況。

結尾

我們可以發現若不透過 Model 來操作資料是一件非常麻煩的事情,而且這些動作也不符合 MVC 觀念,畢竟沒有將 Model 的邏輯給切出來,所以當系統越來越龐大時,就會導致系統維護上的困擾。