【问题标题】:How to execute an `explain select` on a laravel builder如何在 laravel 构建器上执行“解释选择”
【发布时间】:2020-05-15 18:35:48
【问题描述】:

我知道我可以从查询日志中获取原始查询,粘贴所有绑定的变量(也可以在查询日志中找到),在查询前面添加explain,然后直接在 mysql 中运行控制台以获取查询的解释....但是有没有更快的方法来获取解释?

理想情况下,我想做这样的事情:

$query = User::where("favorite_color", "blue");

dd($query->explain());

(显然,实际的查询要复杂得多,并且有一些连接)

我尝试像这样添加explain

$query->selectRaw("explain select user.*");

但这导致查询以:

开头
select explain select...

... 这只是无效的 sql。

【问题讨论】:

  • 据我所知,没有功能可以做到这一点。您必须使用查询生成器创建查询并手动添加 EXPLAIN。然后你可以手动执行这个查询。

标签: php mysql laravel explain


【解决方案1】:

Laravel 8.12 开始,您只需在查询构建器上调用->explain(),就像您在问题中描述的那样。

【讨论】:

    【解决方案2】:

    首先,将代码改为原始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);
    

    【讨论】:

    • 这并不像我希望的那样优雅,但是如果不将构建器转换为原始 SQL,似乎没有办法做到这一点。
    • 值得注意的是$query->getBindings()中的值需要用引号括起来,否则任何带有空格的绑定变量都会产生错误的SQL。
    • @Skeets 我已经更新了字符串值的答案。
    猜你喜欢
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2020-04-22
    • 2021-11-03
    • 2011-09-21
    • 2011-10-20
    相关资源
    最近更新 更多