开发调试时,可能需要调试某个节点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`

本文介绍如何在Laravel/Lumen中扩展DB Query和Eloquent Builder,以实现SQL语句在调试时的参数明确展示,提升调试效率。

1万+

被折叠的 条评论
为什么被折叠?



