前言:(瞎叨叨幾句,可直接跳過~)
在laravel中,如果我們想要獲取ORM或者DB模型最終形成的sql,往往會使用到toSql()這個方法 辨嗽。然而問題在于,傳遞進(jìn)模型的參數(shù)在toSql結(jié)果中是用 "?" 代替的淮腾,這就導(dǎo)致我們不能直觀的進(jìn)行調(diào)試糟需,甚至當(dāng)我們使用其作為子查詢語句時,會出現(xiàn)參數(shù)不能補(bǔ)全的問題谷朝。然而對于此問題洲押,官方并沒有提供合適的方法,所以徘禁,我們只能通過自己來曲線救國一波~ 經(jīng)過搜索實(shí)踐诅诱,分享方案如下:
打開AppServiceProvider(方便起見直接使用app,亦可自定義Provider)
在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());
});
解釋:macro用于為Builder擴(kuò)展方法供外部調(diào)用送朱,getBindings()則是用來獲取綁定參數(shù)的娘荡,然后剩下的就是將toSql結(jié)果和getBindings結(jié)果進(jìn)行合并~得到我們想要的完整sql
接下來,我們便可以在外部調(diào)用模型的sql方法來獲取完整的sql驶沼,例如:
DB::table('user')->where(['id'=1])->sql();
User::where(['id'=1])->sql();
注意:本文教程適用于Laravel5.3以上