Как я могу получить запрос mysql
запроса laravel
Преобразовать
App\User::where('balance','>',0)->where(...)->get();
To:
SELECT * FROM users WHERE `balance`>0 and ...
Как я могу получить запрос mysql
запроса laravel
Преобразовать
App\User::where('balance','>',0)->where(...)->get();
To:
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()
, а затем вывести на экран последние запущенные запросы, вы можете использовать это,
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" = > "Провайдеры" = > "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-запросы без редактирования кода.
Чтобы напечатать один запрос, используйте метод toSql() для laravel, чтобы запрос выполнялся как
App\User::where('balance','>',0)->where(...)->toSql();
Laravel может дополнительно записать в память все запросы, которые были запущены для текущего запроса. Но в некоторых случаях, например, при вставке большого количества строк, это может заставить приложение использовать избыточную память, поэтому вам следует избегать этого.
Чтобы включить журнал, вы можете использовать метод enableQueryLog как
DB::connection()->enableQueryLog();
Чтобы получить массив выполненных запросов, вы можете использовать метод getQueryLog как
$queries = DB::getQueryLog();
вы можете получить более подробную информацию здесь Laravel Включить журнал запросов
Другой подход для отображения всех запросов, используемых в Laravel без включения журнала запросов, установить LaravelDebugBar отсюда Laravel Debug Bar. Это пакет, который позволяет вам быстро и легко следить за приложениями во время разработки.
Вы можете использовать библиотеку barryvdh/laravel-debugbar
Очень простой и быстрый путь ниже Запишите имя столбца неправильно, как write 'balancedd', несмотря на "баланс", и запрос будет отображаться на экране ошибки, когда вы выполняете код со всеми параметрами и ошибкой, которые столбец не найден.
DB::enableQueryLog();
(Query)
$d= DB::getQueryLog(); print"<pre>"; print_r ($d); print"</pre>";
вы получите запрошенный mysql-запрос.
В Laravel и даже PHP нет такой вещи, поскольку PHP внутренне отправляет параметры с строкой запроса в базу данных, где она (возможно) анализируется в необработанную строку запроса.
Принятый ответ на самом деле является оптимистичным решением, вроде "необязательно работает".