开发调试时,可能需要调试某个节点SQL完整的执行语句
而Laravel/Lumen默认提供的在查看上不够直观,例如:select * from TableName where id = ?
参数值以?
作为占位,显得不够直观
基于上述情况,我们可以扩展DB的Query方法来实现需求;
在App\Providers\AppServiceProvider
的register
方法内
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
// 引入注册接口
use Illuminate\Database\Query\Builder AS queryBuilder;
use Illuminate\Database\Eloquent\Builder AS eloquentBuilder;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
// 注册自定义query方法:toRawSql
queryBuilder::macro('toRawSql', function(){
// 执行逻辑
return array_reduce($this->getBindings(), function($sql, $binding){
return preg_replace('/\?/', is_numeric($binding) ? $binding : $binding, $sql, 1);
}, $this->toSql());
});
// Eloquent ORM注册自定义query方法:toRawSql
eloquentBuilder::macro('toRawSql', function(){
return $this->getQuery()->toRawSql();
});
}
}
当我们注册好DB query的自定义方法后,使用方式:
$_rsSql = DB::table('TableName')->where('id',1)->toRawSql();
// $_rsSql返回:
// select * from `TableName` where `id` = 1
Eloquent ORM方式:
$_rsSql = \App\Models\Users::toRawSql(;
// $_rsSql返回:
// select * from `users`