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?

Author: Karl Hill, 2015-01-03

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

 269
Author: Marty Aghajanyan,
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")

 45
Author: Skeets,
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.

 17
Author: Vineet Garg,
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.

 15
Author: Rubén Ruíz,
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);
    }
);
 13
Author: Luís Cruz,
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

 8
Author: larp,
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'
 6
Author: doncadavona,
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); });
 2
Author: ChrisH,
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);
 1
Author: Saint Father,
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.

 1
Author: ch271828n,
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));
        });
    }
}
 0
Author: Javier Núñez,
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.

 0
Author: Gufran Hasan,
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"

 0
Author: Siva,
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.

 -3
Author: Rupali Pemare,
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