Как выполнить `объяснение выбора` на laravel сборщике - PullRequest
1 голос
/ 30 января 2020

Я знаю, что могу получить необработанный запрос из журнала запросов, вставить все связанные переменные (также найденные в журнале запросов), добавить explain в начало запроса и запустить его непосредственно в mysql консоль, чтобы получить объяснение для запроса .... но есть ли более быстрый способ получить объяснение?

В идеале, я хотел бы сделать что-то вроде этого:

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

dd($query->explain());

(очевидно, что фактический запрос будет намного сложнее и с некоторыми объединениями)

Я попытался добавить explain следующим образом:

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

Но это привело к запрос, который начался с:

select explain select...

... который просто недействителен sql.

1 Ответ

1 голос
/ 30 января 2020

Во-первых, измените код на raw sql,

Во-вторых, затем добавьте объяснение перед raw 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);
...