Jak wykonać zapytanie w Laravel 5? DB:: getQueryLog () zwracająca pustą tablicę
Próbuję wyświetlić Dziennik dla zapytania, ale DB::getQueryLog()
zwraca tylko pustą tablicę:
$user = User::find(5);
print_r(DB::getQueryLog());
Wynik
Array
(
)
Jak mogę wyświetlić Dziennik dla tego zapytania?
14 answers
Domyślnie dziennik zapytań jest wyłączony w Laravel 5: https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448
Będziesz musiał włączyć dziennik zapytań, wywołując:
DB::enableQueryLog();
// and then you can get query log
dd(DB::getQueryLog());
Lub zarejestrować słuchacza zdarzeń:
DB::listen(
function ($sql, $bindings, $time) {
// $sql - select * from `ncv_users` where `ncv_users`.`id` = ? limit 1
// $bindings - [5]
// $time(in milliseconds) - 0.38
}
);
Kilka Porad
1. Wiele połączeń DB
Jeśli masz więcej niż jedno połączenie DB, musisz określić, które połączenie ma być logowane
Aby włączyć dziennik zapytań dla my_connection
:
DB::connection('my_connection')->enableQueryLog();
Aby uzyskać dziennik zapytań dla my_connection
:
print_r(
DB::connection('my_connection')->getQueryLog()
);
2. Gdzie włączyć dziennik zapytań ?
W przypadku cyklu życia żądania HTTP można włączyć logowanie zapytań w metodzie 'handle` niektórych 'BeforeAnyDbQueryMiddleware' [middleware] [1], a następnie pobrać wykonane zapytania w metodzie [`terminate'] [2] tego samego middleware.class BeforeAnyDbQueryMiddleware
{
public function handle($request, Closure $next)
{
DB::enableQueryLog();
return $next($request);
}
public function terminate($request, $response)
{
// Store or dump the log data...
dd(
DB::getQueryLog()
);
}
}
Łańcuch middleware nie będzie uruchamiany dla komend artisan, więc dla wykonania CLI możesz włączyć logowanie zapytań w detektorze zdarzeń artisan.start
.
Na przykład możesz umieścić go w bootstrap/app.php
plik
$app['events']->listen('artisan.start', function(){
\DB::enableQueryLog();
});
3. Pamięć
Laravel przechowuje wszystkie zapytania w pamięci. Tak więc w niektórych przypadkach, na przykład podczas wstawiania dużej liczby wierszy lub długotrwałego zadania z dużą ilością zapytań, może to spowodować, że aplikacja wykorzysta nadmiar pamięci.
W większości przypadków dziennik zapytań będzie potrzebny tylko do debugowania, a w takim przypadku polecam włączyć go tylko dla rozwój.
if (App::environment('local')) {
// The environment is local
DB::enableQueryLog();
}
Referencje
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-11 22:57:41
Jeśli zależy Ci tylko na rzeczywistym zapytaniu (ostatnim uruchomieniu) w celu szybkiego debugowania:
DB::enableQueryLog();
# your laravel query builder goes here
$laQuery = DB::getQueryLog();
$lcWhatYouWant = $laQuery[0]['query']; # <-------
# optionally disable the query log:
DB::disableQueryLog();
Wykonaj print_r()
na $laQuery[0]
, aby uzyskać pełne zapytanie, w tym wiązania. (powyższa zmienna $lcWhatYouWant
zastąpi zmienną ??
)
Jeśli używasz czegoś innego niż główne połączenie mysql, musisz użyć tego zamiast:
DB::connection("mysql2")->enableQueryLog();
DB::connection("mysql2")->getQueryLog();
(z nazwą połączenia gdzie jest "mysql2")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-21 09:35:08
Musisz najpierw włączyć rejestrowanie zapytań
DB::enableQueryLog();
Następnie możesz uzyskać dzienniki zapytań po prostu:
dd(DB::getQueryLog());
Byłoby lepiej, jeśli włączysz rejestrowanie zapytań przed uruchomieniem aplikacji, co możesz zrobić w BeforeMiddleware, a następnie pobrać wykonane zapytania w AfterMiddleware.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-06 12:36:11
Umieść to na trasach.plik php:
\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
echo'<pre>';
var_dump($query->sql);
var_dump($query->bindings);
var_dump($query->time);
echo'</pre>';
});
Submitted by msurguy, source code in this page . Ten fix-code dla laravel 5.2 znajdziesz w komentarzach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-22 21:14:16
Najwyraźniej z Laravel 5.2, zamknięcie w DB::listen
otrzymuje tylko jeden parametr.
Więc jeśli chcesz użyć DB::listen
w Laravel 5.2, powinieneś zrobić coś takiego:
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+'
);
fwrite($logFile, date('Y-m-d H:i:s') . ': ' . $query . PHP_EOL);
fclose($logFile);
}
);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-06 16:49:35
Dla laravel 5.8 wystarczy dodać dd lub zrzut.
Ex:
DB::table('users')->where('votes', '>', 100)->dd();
Lub
DB::table('users')->where('votes', '>', 100)->dump();
Odniesienie: https://laravel.com/docs/5.8/queries#debugging
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-23 06:08:07
Użyj toSql()
zamiast get()
w ten sposób:
$users = User::orderBy('name', 'asc')->toSql();
echo $users;
// Outputs the string:
'select * from `users` order by `name` asc'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-02 08:41:35
(Laravel 5.2) uważam, że najprostszym sposobem jest dodanie jednej linii kodu do monitorowania zapytań sql:
\DB::listen(function($sql) {var_dump($sql); });
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-21 09:36:07
Kontynuując najwyraźniej z Laravel 5.2, zamknięcie w DB::listen otrzymuje tylko jeden parametr... odpowiedź powyżej: możesz umieścić ten kod w skrypcie Middleware i używać go w trasach.
DODATKOWO:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('sql');
$log->pushHandler(new StreamHandler(storage_path().'/logs/sql-' . date('Y-m-d') . '.log', Logger::INFO));
// add records to the log
$log->addInfo($query, $data);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:06
Ten kod jest dla:
- Laravel 5.2
- Zaloguj się do bazy danych mysql
Oto kod, który jest oparty na odpowiedzi @milz:
DB::listen(function($sql) {
$LOG_TABLE_NAME = 'log';
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);
if(stripos($query, 'insert into `'.$LOG_TABLE_NAME.'`')===false){
$toLog = new LogModel();
$toLog->uId = 100;
$toLog->sql = $query;
$toLog->save();
}
});
Rdzeniem jest linia if(stripos...
, która zapobiega rekurencji wstawiania instrukcji insert into log
sql do bazy danych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-08 09:10:16
Myślę, że odpowiedź znajduje się w tym artykule: https://arjunphp.com/laravel-5-5-log-eloquent-queries/
Jest szybki i prosty do osiągnięcia rejestrowania zapytań.
Wystarczy dodać do AppServiceProvider
w metodzie boot
wywołanie zwrotne, aby odsłuchać zapytania DB:
namespace App\Providers;
use DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
DB::listen(function($query) {
logger()->info($query->sql . print_r($query->bindings, true));
});
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-21 12:48:06
Załóżmy, że chcesz wydrukować zapytanie SQL następujących instrukcji.
$user = User::find(5);
Musisz wykonać następujące czynności:
DB::enableQueryLog();//enable query logging
$user = User::find(5);
print_r(DB::getQueryLog());//print sql query
Wyświetli Ostatnie wykonane zapytanie w Laravel.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-20 05:19:38
Dodaj tę funkcję do pliku pomocnika i po prostu wywołaj.
function getRawQuery($sql){
$query = str_replace(array('?'), array('\'%s\''), $sql->toSql());
$query = vsprintf($query, $sql->getBindings());
return $query;
}
Wyjście: "select * from user where status = '1' order by id desc limit 25 offset 0"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-06 13:18:46
Dla laravel 5 i nowszych, użycie tylko DB:: getQueryLog (), nie zadziała. Domyślnie w tym wartość
protected $loggingQueries = false;
Zmień na
protected $loggingQueries = true;
W poniższym pliku do logowania zapytania.
/vendor/laravel/framework/src/illuminate/Database/Connection.php
A następnie możemy użyć DB::getQueryLog()
gdzie chcesz wydrukować zapytanie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-21 09:35:34