给定以下代码:
DB::table('users')->get();
我想得到上面的数据库查询生成器将生成的原始SQL查询字符串。在本例中,它将是SELECT*FROM用户。
我该怎么做?
给定以下代码:
DB::table('users')->get();
我想得到上面的数据库查询生成器将生成的原始SQL查询字符串。在本例中,它将是SELECT*FROM用户。
我该怎么做?
当前回答
你可以使用发条
Clockwork是一个用于PHP开发的Chrome扩展,通过一个新面板扩展了Developer Tools,该面板提供了用于调试和分析PHP应用程序的各种信息,包括请求、标头、获取和发布数据、cookie、会话数据、数据库查询、路由、应用程序运行时可视化等信息。
但也适用于firefox
其他回答
第一种方式:
只需使用toSql()方法,
$query = DB::table('users')->get();
echo $query->toSql();
如果它不起作用,你可以从laravel文档中设置它。
第二种方式:
另一种方法是
数据库::getQueryLog()
但是如果它返回一个空数组,那么默认情况下它被禁用,
只需使用DB::enableQueryLog()启用即可:)
有关更多信息,请访问Github Issue了解更多信息。
希望有帮助:)
您可以使用toSql方法-最简单的方法
DB::table('users')->toSql();
此外,如果您的查询中有绑定,并且希望查看带有绑定的查询。你不能用这样的东西:
$query = DB::table('table')->whereIn('some_field', [1,2,30]);
$sql_with_bindings = str_replace_array('?', $query->getBindings(), $query->toSql());
dd($sql_with_bindings);
如果您试图使用Illuminate而不使用Laravel获取日志,请使用:
\Illuminate\Database\Capsule\Manager::getQueryLog();
你也可以像这样设置一个快速功能:
function logger()
{
$queries = \Illuminate\Database\Capsule\Manager::getQueryLog();
$formattedQueries = [];
foreach ($queries as $query) :
$prep = $query['query'];
foreach ($query['bindings'] as $binding) :
if (is_bool($binding)) {
$val = $binding === true ? 'TRUE' : 'FALSE';
} else if (is_numeric($binding)) {
$val = $binding;
} else {
$val = "'$binding'";
}
$prep = preg_replace("#\?#", $val, $prep, 1);
endforeach;
$formattedQueries[] = $prep;
endforeach;
return $formattedQueries;
}
EDIT
更新的版本似乎在默认情况下禁用了查询日志记录(上面返回了一个空数组)。要重新启用,在初始化Capsule Manager时,获取连接的实例并调用enableQueryLog方法
$capsule::connection()->enableQueryLog();
再次编辑
考虑到实际问题,您实际上可以执行以下操作来转换当前的单个查询,而不是之前的所有查询:
$sql = $query->toSql();
$bindings = $query->getBindings();
有一种获取查询字符串的方法。
到SQL()
在我们的情况下,
DB::table('users')->toSql();
回来
select * from users
是返回SQL查询字符串的确切解决方案。。希望这有帮助。。。
从Laravel 5.8.15开始,查询生成器现在有dd和dump方法
DB::table('data')->where('a', 1)->dump();