如何在 laravel 构建器上执行 `explain select`
How to execute an `explain select` on a laravel builder
我知道我可以从查询日志中获取原始查询,粘贴所有绑定变量(也在查询日志中找到),在查询前面打一个 explain
,然后 运行 它直接在 mysql 控制台中获取查询的解释....但是有没有更快的方法来获取解释?
理想情况下,我想做这样的事情:
$query = User::where("favorite_color", "blue");
dd($query->explain());
(显然,实际的查询会复杂得多并且有一些连接)
我试过这样添加 explain
:
$query->selectRaw("explain select user.*");
但这导致查询以以下内容开头:
select explain select...
... 无效 sql。
首先,将代码更改为原始代码 sql,
其次然后在原始sql、
之前添加解释
并使用DB::select()
$query = User::where("favorite_color", "blue");
$bindings = collect($query->getBindings())->map(function($q) {
return is_string($q)? "\"$q\"": $q;
})->all();
$sql_with_bindings = str_replace_array('?', $bindings, $query->toSql());
DB::select("explain ".$sql_with_bindings);
从 Laravel 8.12 开始,您只需在查询构建器上调用 ->explain()
,就像您在问题中描述的那样。
我知道我可以从查询日志中获取原始查询,粘贴所有绑定变量(也在查询日志中找到),在查询前面打一个 explain
,然后 运行 它直接在 mysql 控制台中获取查询的解释....但是有没有更快的方法来获取解释?
理想情况下,我想做这样的事情:
$query = User::where("favorite_color", "blue");
dd($query->explain());
(显然,实际的查询会复杂得多并且有一些连接)
我试过这样添加 explain
:
$query->selectRaw("explain select user.*");
但这导致查询以以下内容开头:
select explain select...
... 无效 sql。
首先,将代码更改为原始代码 sql,
其次然后在原始sql、
之前添加解释并使用DB::select()
$query = User::where("favorite_color", "blue");
$bindings = collect($query->getBindings())->map(function($q) {
return is_string($q)? "\"$q\"": $q;
})->all();
$sql_with_bindings = str_replace_array('?', $bindings, $query->toSql());
DB::select("explain ".$sql_with_bindings);
从 Laravel 8.12 开始,您只需在查询构建器上调用 ->explain()
,就像您在问题中描述的那样。