看到這一篇想必你一定會覺得很茫然為什麼要突然從 Model 基礎操作跳到資料操作呢?主要原因是想讓你明白,其實也可以使用原生的寫法來操作資料,而且不需要透過 Model,那麼就讓我們一探究竟吧!
首先如果我們想要在 Controller 中操作 DB,那就必須引入 ThinkPHP 所提供的函式庫,否則是無法操控 DB 的:
use think\Db;
那麼由於為了避免搞混以及我個人想保留每一段我撰寫的程式碼,所以我另外建立的一個資料夾叫做 dbexample 並建立相關檔案,內容部分就不額外提供 ↓
最主要的 Controller 初始內容會提供在這裡:
<?php
namespace app\dbexample\controller;
use think\Controller;
use think\Db;
class Index extends Controller
{
public function index()
{
}
}
接下來我們在前面有學過原生的 SQL 語法,首先先讓我們建立一個資料表叫 think_db
:
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 指令就可以達到我們要的效果,這邊舉例新增資料:
$result = Db::execute('INSERT INTO think_db (name) VALUE ("王大明")');
dump($result);
最後請務必記得語法結束後,要補上 dump()
,否則並不會執行你的 SQL 指令。
$result = Db::execute('UPDATE think_db SET name="QQ 先生"');
dump($result);
前面有講到唯獨查詢是使用 Db::query()
的方式,所以在撰寫上要稍微注意一下:
$result = Db::query('SELECT think_db SET name="QQ 先生"');
dump($result);
$result = Db::query('DELETE think_db SET name="QQ 先生"');
dump($result);
那麼我們可以將上方新增、編輯、查詢以及刪除的 SQL 指令,個別包成一個 function,稍後透過路由來訪問 Controller 進而執行這些 SQL 指令:
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);
}
註冊路由的部分比較沒有什麼好講的,因為只是要作範例,所以我這邊一路都使用 get
來註冊路由:
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,避免出現無法訪問之問題。
建議流程:add → updata → select → delete (否則可能出現錯誤)
那麼我這邊就只附上查詢的結果 ↓
當然你也可以透過 Db
中其中一個方法來切換資料庫連結,也就是 Db::connect([資料庫連接])
,範例如下:
$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 內容當作範例,然後製作成一個陣列,並依照相關參數這樣傳入即可:
$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 的邏輯給切出來,所以當系統越來越龐大時,就會導致系統維護上的困擾。
本文同步發表於:https://hsiangfeng.github.io/php/20190917/3037813271/