Запрос Laravel на запрос sql

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

Конвертировать:

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

Для того, чтобы:

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

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

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

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

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

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

 dd(DB::getQueryLog()); 

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

 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) 

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

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

Справка

Вместо того, чтобы вмешиваться в приложение с заявлениями печати или « 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 

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

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

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

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

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

Вот вспомогательная функция, которая сообщает вам, что последний 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; } 

В Laravel 5.4 (я не проверял это в других версиях) добавьте эту функцию в «App» => «Providers» => «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('\'Ymd 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('Ym-d') . '_query.log'), 'a+' );*/ Log::notice("[USER] $query"); } ); } } 

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

Способ 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 . Это пакет, который позволяет вам быстро и легко следить за приложениями во время разработки.

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

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

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

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

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