Laravel 打印输出模型执行的最终sql语句

一、框架自带打印sql语句存在的问题

Laravel 自带打印查询执行的sql的方法 toSql 和 加日志输出到 storage 目录

两种方式,打出的sql都是待执行的,即 bidings 参数没有替换到原生sql语句中,像下面两图一样:

Laravel 打印输出模型执行的最终sql语句_第1张图片

Laravel 打印输出模型执行的最终sql语句_第2张图片

 这种情况,简单sql还可以看看有没有存在问题

二、实际问题:

今天遇到一个相对复杂的业务场景,拼接多个whereRaw的sql语句,在程序里将执行sql(上图中的)打出来放到数据库执行,是可以拿到预期符合条件数据(如下图),但是程序执行,怎么都拿不到数据,很是奇怪

Laravel 打印输出模型执行的最终sql语句_第3张图片

 三、解决方法:

看到上面sql在数据库执行完全没问题,于是猜测问题应该是laravel执行的语句有问题,就想方设法打印出最终执行sql,过程不再多说,直接看方法:

public function getFinalSql($query)
{
    $sql_str = $query->toSql();
    $bindings = $query->getBindings();

    $wrapped_str = str_replace('?', "'?'", $sql_str);

    return str_replace_array('?', $bindings, $wrapped_str);
}

在执行查询语句前,调用该方法,将返回结果打印,就可以看到框架模型最终执行的语句:

然后观察语句发现like时,框架给字符串自动拼接了引号转义符并且多加了一层 单引号,导致语句不正确,所以查询拿不到预期数据,修改后即可

你可能感兴趣的:(sql,laravel,数据库,laravel,打印sql,模型执行sql)