美文网首页ITLaravel
laravel获取完整带参数的sql语句

laravel获取完整带参数的sql语句

作者: 丶Lukez | 来源:发表于2019-03-21 17:53 被阅读0次

    前言:(瞎叨叨几句,可直接跳过~)
    在laravel中,如果我们想要获取ORM或者DB模型最终形成的sql,往往会使用到toSql()这个方法 。然而问题在于,传递进模型的参数在toSql结果中是用 "?" 代替的,这就导致我们不能直观的进行调试,甚至当我们使用其作为子查询语句时,会出现参数不能补全的问题。然而对于此问题,官方并没有提供合适的方法,所以,我们只能通过自己来曲线救国一波~ 经过搜索实践,分享方案如下:

    打开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扩展方法供外部调用,getBindings()则是用来获取绑定参数的,然后剩下的就是将toSql结果和getBindings结果进行合并~得到我们想要的完整sql

    接下来,我们便可以在外部调用模型的sql方法来获取完整的sql,例如:

    DB::table('user')->where(['id'=1])->sql();
    User::where(['id'=1])->sql();
    

    注意:本文教程适用于Laravel5.3以上

    相关文章

      网友评论

        本文标题:laravel获取完整带参数的sql语句

        本文链接:https://www.haomeiwen.com/subject/tsbcvqtx.html