ORM 中 SQL 查詢檢視
查過很多查詢 SQL 的方法,但發現非常多問題:
- 改起來太麻煩
- 安裝各種外掛
- 好不容易找到程式碼了,改了之後卻發現壓根沒生效...
所以對於中大型專案來說,最好就是一段程式碼解決問題。以下方法正好滿足上面 2 個問題:
- 無需安裝任何外掛,並且 改動幅度小(只需改一個檔案)
- 簡單易用,解決後顧之憂~
功能適合於 Laravel 5.5 ~ 5.8 版本
一、修改檔案
在 app/Providers/AppServiceProvider
中的 boot
方法中新增以下程式碼:
\Illuminate\Database\Query\Builder::macro('sql', function () {
$bindings = $this->getBindings();
$sql = str_replace('?','%s',$this->toSql());
return vsprintf($sql, $bindings);
});
\Illuminate\Database\Eloquent\Builder::macro('sql', function(){
return ($this->getQuery()->sql());
});
二、使用方式
查詢帶引數的 SQL 語句可在 ORM 後呼叫方法
// 正確用法
User::query()->where('id', 1)->sql();
// 錯誤用法
User::query()->where('id', 1)->get()->sql();
User::query()->where('id', 1)->first()->sql();
三、效果預覽
select * from user where id = 1
「帖外話」ORM 的 IDE 函式語法提示
可在模型中新增靜態方法 query()
,後續的 where()
、orderByDesc()
等等相關的 ORM 都能有語法提示。
值得 注意 的是:這裡僅僅為了有提示,方便開發者除錯、檢視相關引數使用方式,但實際上 官方推薦 的寫法是不帶
query()
的,如:User::where()->get();
User::query()->where('id', 1)->sql();