Генерация необработанного MySQL-запроса из Laravel Query Builder

Как я могу получить запрос mysql запроса laravel

Преобразовать

App\User::where('balance','>',0)->where(...)->get();

To:

SELECT * FROM users WHERE `balance`>0 and ...

Ответ 1

использовать toSql() метод laravel, чтобы запрос выполнялся как

App\User::where('balance','>',0)->where(...)->toSql();

Но Laravel не покажет вам параметры в вашем запросе, потому что они связаны после подготовки запроса. Чтобы получить параметры привязки, используйте этот

$query=App\User::where('balance','>',0)->where(...);
print_r($query->getBindings() );

включить журнал запросов как DB::enableQueryLog(), а затем вывести на экран последние запущенные запросы, вы можете использовать это,

dd(DB::getQueryLog());

Ответ 2

вы можете добавить эту функцию к своим помощникам

function getRealQuery($query, $dumpIt = false)
{
    $params = array_map(function ($item) {
        return "'{$item}'";
    }, $query->getBindings());
    $result = str_replace_array('\?', $params, $query->toSql());
    if ($dumpIt) {
        dd($result);
    }
    return $result;
}

и используйте вот так:

getRealQuery(App\User::where('balance','>',0)->where(...),true)

Ответ 3

Чтобы распечатать необработанный SQL-запрос, попробуйте:

DB::enableQueryLog();
// Your query here
$queries = DB::getQueryLog();
print_r($queries);

Ссылка

Ответ 4

Вместо того, чтобы вмешиваться в приложение с операторами печати или "dd s", я делаю следующее, когда хочу увидеть сгенерированный SQL:

DB::listen(function ($query) { 
    Log::info($query->sql, $query->bindings);
});

// (DB and Log are the facades in Illuminate\Support\Facades namespace)

Это приведет к выводу sql в журнал Laravel (расположенный в storage/logs/laravel.log). Полезной командой для следующих записей в этот файл является

tail -n0 -f storage/logs/laravel.log

Ответ 5

Простым способом отображения всех запросов, используемых в Laravel без каких-либо изменений кода, является установка LaravelDebugBar (https://laravel-news.com/laravel-debugbar).

В рамках функциональности вы получаете вкладку, которая покажет вам все запросы, которые использовала страница.

Ответ 6

Чтобы получить запрос mysql в laravel, вам нужно зарегистрировать свой запрос как

DB::enableQueryLog();
App\User::where('balance','>',0)->where(...)->get();
print_r(DB::getQueryLog());

Проверить ссылку: https://laravel.com/docs/5.0/database#query-logging

Ответ 7

Вот вспомогательная функция, которая сообщает вам, что последний SQL выполнен.

use DB;
public static function getLastSQL()
{
    $queries = DB::getQueryLog();
    $last_query = end($queries);
          // last_query is the SQL with with data binding like 
          //   { 
          //       select ? from sometable where field = ? and field2 = ? ;
          //       param1,
          //       param2,
          //       param3,
          //   }
          //   which is hard to read.
    $last_query = bindDataToQuery($last_query);     
          // here, last_query is the last SQL you have executed as normal SQL
          //     select param1 from sometable where field=param2 and field2 = param3;
    return $last_query
}

Вот функция bindDataToQuery, которая заполняет '?' пробелы с реальными параметрами.

protected static function bindDataToQuery($queryItem){
    $query = $queryItem['query'];
    $bindings = $queryItem['bindings'];
    $arr = explode('?',$query);
    $res = '';
    foreach($arr as $idx => $ele){
        if($idx < count($arr) - 1){
            $res = $res.$ele."'".$bindings[$idx]."'";
        }
    }
    $res = $res.$arr[count($arr) -1];
    return $res;
}

Ответ 8

В Laravel 5.4 (я не проверял это в других версиях), добавьте эту функцию в "App" = > "Провайдеры" = > "AppServiceProvider.php".

public function boot()
{

    if (App::isLocal()) {

        DB::listen(
            function ($sql) {
                // $sql is an object with the properties:
                //  sql: The query
                //  bindings: the sql query variables
                //  time: The execution time for the query
                //  connectionName: The name of the connection

                // To save the executed queries to file:
                // Process the sql and the bindings:
                foreach ($sql->bindings as $i => $binding) {
                    if ($binding instanceof \DateTime) {
                        $sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
                    } else {
                        if (is_string($binding)) {
                            $sql->bindings[$i] = "'$binding'";
                        }
                    }
                }

                // Insert bindings into query
                $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql);

                $query = vsprintf($query, $sql->bindings);

                // Save the query to file
                /*$logFile = fopen(
                    storage_path('logs' . DIRECTORY_SEPARATOR . date('Y-m-d') . '_query.log'),
                    'a+'
                );*/
                Log::notice("[USER] $query");
            }
        );
    }
}

После этого установите, https://github.com/ARCANEDEV/LogViewer а затем вы можете просмотреть все выполненные SQL-запросы без редактирования кода.

Ответ 9

Метод 1

Чтобы напечатать один запрос, используйте метод toSql() для laravel, чтобы запрос выполнялся как

App\User::where('balance','>',0)->where(...)->toSql();

Метод 2

Laravel может дополнительно записать в память все запросы, которые были запущены для текущего запроса. Но в некоторых случаях, например, при вставке большого количества строк, это может заставить приложение использовать избыточную память, поэтому вам следует избегать этого.

Чтобы включить журнал, вы можете использовать метод enableQueryLog как

DB::connection()->enableQueryLog();

Чтобы получить массив выполненных запросов, вы можете использовать метод getQueryLog как

$queries = DB::getQueryLog();

вы можете получить более подробную информацию здесь Laravel Включить журнал запросов

Способ 3

Другой подход для отображения всех запросов, используемых в Laravel без включения журнала запросов, установить LaravelDebugBar отсюда Laravel Debug Bar. Это пакет, который позволяет вам быстро и легко следить за приложениями во время разработки.

Ответ 11

Очень простой и быстрый путь ниже Запишите имя столбца неправильно, как write 'balancedd', несмотря на "баланс", и запрос будет отображаться на экране ошибки, когда вы выполняете код со всеми параметрами и ошибкой, которые столбец не найден.

Ответ 12

DB::enableQueryLog(); (Query) $d= DB::getQueryLog(); print"<pre>"; print_r ($d); print"</pre>";

вы получите запрошенный mysql-запрос.

Ответ 13

В Laravel и даже PHP нет такой вещи, поскольку PHP внутренне отправляет параметры с строкой запроса в базу данных, где она (возможно) анализируется в необработанную строку запроса.

Принятый ответ на самом деле является оптимистичным решением, вроде "необязательно работает".