如何在执行查询之前从Laravel的查询生成器获取原始查询字符串?

Mat*_*iva 19 sql laravel laravel-4

我有一个由一些条件创建的复杂查询,我想从构建器对象中获取最终的SQL查询即将执行.我能这样做吗?

Ant*_*iro 47

你可以做到:

$query = DB::table('brands')
                ->join('products','a','=','c')
                ->whereNull('whatever');

echo $query->toSql();
Run Code Online (Sandbox Code Playgroud)

但是Laravel不会在查询中显示参数,因为它们在准备查询后被绑定.

所以你也可以这样做:

print_r( $query->getBindings() );
Run Code Online (Sandbox Code Playgroud)


and*_*79h 22

对于调试,这可能非常方便,因为它返回带有绑定的SQL,因此您可以立即将其放入数据库控制台.

/**
 * Combines SQL and its bindings
 *
 * @param \Eloquent $query
 * @return string
 */
public static function getEloquentSqlWithBindings($query)
{
    return vsprintf(str_replace('?', '%s', $query->toSql()), collect($query->getBindings())->map(function ($binding) {
        return is_numeric($binding) ? $binding : "'{$binding}'";
    })->toArray());
}
Run Code Online (Sandbox Code Playgroud)

https://gist.github.com/thonyx/c061d56dc620284ab22526294b43518a找到了这个片段,所以所有学分都是https://gist.github.com/thonyx :)

  • 这适合我.比上面接受的答案要好得多. (2认同)
  • 我得到一个vsprintf参数太少 (2认同)

小智 7

Piggy 放弃了 andi79h 的回答。该函数运行良好,但它假设绑定不包含任何可能破坏查询的引号。

我在 $bindings 中添加了“addslashes”以使其更安全。不过,理想情况下,如果您有可用的活动连接,则应通过 mysqli_real_escape_string() 运行它。 https://www.php.net/manual/en/mysqli.real-escape-string.php

/**
 * Combines SQL and its bindings
 *
 * @param \Eloquent $query
 * @return string
 */
public static function getEloquentSqlWithBindings($query)
{
    return vsprintf(str_replace('?', '%s', $query->toSql()), collect($query->getBindings())->map(function ($binding) {
        $binding = addslashes($binding);
        return is_numeric($binding) ? $binding : "'{$binding}'";
    })->toArray());
}
Run Code Online (Sandbox Code Playgroud)