给定以下代码:
DB::table('users')->get();
我想得到上面的数据库查询生成器将生成的原始SQL查询字符串。在本例中,它将是SELECT*FROM用户。
我该怎么做?
给定以下代码:
DB::table('users')->get();
我想得到上面的数据库查询生成器将生成的原始SQL查询字符串。在本例中,它将是SELECT*FROM用户。
我该怎么做?
当前回答
你可以使用发条
Clockwork是一个用于PHP开发的Chrome扩展,通过一个新面板扩展了Developer Tools,该面板提供了用于调试和分析PHP应用程序的各种信息,包括请求、标头、获取和发布数据、cookie、会话数据、数据库查询、路由、应用程序运行时可视化等信息。
但也适用于firefox
其他回答
DB::QueryLog()仅在使用$builder->get()执行查询后才起作用。
如果要在执行查询之前或不执行查询时获取原始查询,可以使用$builder->toSql()方法。
获取原始SQL并替换“?”的示例具有实际绑定值:
$query = str_replace(array('?'), array('\'%s\''), $builder->toSql());
$query = vsprintf($query, $builder->getBindings());
dump($query);
$result = $builder->get();
或者,您可以故意触发错误,例如,使用不存在的表或列。然后,您可以在异常消息中看到生成的查询。
使用debugbar包
composer require "barryvdh/laravel-debugbar": "2.3.*"
试试看:
$results = DB::table('users')->toSql();
dd($results);
注意:get()已替换为toSql()以显示原始SQL查询。
如果您使用的不是Laravel,而是Elquent包,那么:
use \Illuminate\Database\Capsule\Manager as Capsule;
use \Illuminate\Events\Dispatcher;
use \Illuminate\Container\Container;
$capsule = new Capsule;
$capsule->addConnection([
// connection details
]);
// Set the event dispatcher used by Eloquent models... (optional)
$capsule->setEventDispatcher(new Dispatcher(new Container));
// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();
// Setup the Eloquent ORM...(optional unless you've used setEventDispatcher())
$capsule->bootEloquent();
// Listen for Query Events for Debug
$events = new Dispatcher;
$events->listen('illuminate.query', function($query, $bindings, $time, $name)
{
// Format binding data for sql insertion
foreach ($bindings as $i => $binding) {
if ($binding instanceof \DateTime) {
$bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
} else if (is_string($binding)) {
$bindings[$i] = "'$binding'";`enter code here`
}
}
// Insert bindings into query
$query = str_replace(array('%', '?'), array('%%', '%s'), $query);
$query = vsprintf($query, $bindings);
// Debug SQL queries
echo 'SQL: [' . $query . ']';
});
$capsule->setEventDispatcher($events);
第一个选项
当然,有一些方法可以只输出一个查询,并在phpMyAdmin或其他工具中对其进行调试,以了解查询的执行方式。
一种将查询与变量(也称为绑定)一起转储的好方法,您可以将以下函数添加为项目中的公共助手
function queryToSQL($query, $logQuery = true)
{
$addSlashes = str_replace('?', "'?'", $query->toSql());
$sql = str_replace('%', '#', $addSlashes);
$sql = str_replace('?', '%s', $sql);
$sql = vsprintf($sql, $query->getBindings());
$sql = str_replace('#', '%', $sql);
if ($logQuery) {
Log::debug($sql);
}
return $sql;
}
第二个选项
这是另一种方法,而不是转储每个查询,您可以使用Telescope,该工具可以让您更深入地了解可能在后台启动的所有查询,以及每个查询花费的时间以及显示的所有绑定
第三种选择
Laravel Debugbar是一个非常棒的插件,它可以帮助您在小的底部栏下调试所有内容,但这仅适用于基于UI的活动,对于API或命令,调试方式被忽略了,Telescope成为了一个很好的助手