Я намагаюся переглянути журнал запиту, але DB::getQueryLog()
просто повертає порожній масив:
$user = User::find(5);
print_r(DB::getQueryLog());
Результат
Array
(
)
Як я можу переглянути журнал цього запиту?
Я намагаюся переглянути журнал запиту, але DB::getQueryLog()
просто повертає порожній масив:
$user = User::find(5);
print_r(DB::getQueryLog());
Результат
Array
(
)
Як я можу переглянути журнал цього запиту?
Відповіді:
За замовчуванням журнал запитів відключений у Laravel 5: https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448
Вам потрібно буде включити журнал запитів, зателефонувавши:
DB::enableQueryLog();
або зареєструйте слухача події:
DB::listen(
function ($sql, $bindings, $time) {
// $sql - select * from `ncv_users` where `ncv_users`.`id` = ? limit 1
// $bindings - [5]
// $time(in milliseconds) - 0.38
}
);
Якщо у вас є більше одного з'єднання БД, ви повинні вказати, яке з'єднання потрібно ввійти
Щоб увімкнути журнал запитів для my_connection
:
DB::connection('my_connection')->enableQueryLog();
Щоб отримати журнал запитів my_connection
:
print_r(
DB::connection('my_connection')->getQueryLog()
);
Для життєвого циклу запиту HTTP можна ввімкнути журнал запитів у handle
методі деякого середнього BeforeAnyDbQueryMiddleware
програмного забезпечення та потім отримати виконані запити в terminate
методі того ж середнього програмного забезпечення.
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()
);
}
}
Ланцюг середнього ПЗ не запускатиметься для команд ремісників, тому для виконання CLI можна включити вхід запитів у artisan.start
слухачі подій.
Наприклад, ви можете помістити його у bootstrap/app.php
файл
$app['events']->listen('artisan.start', function(){
\DB::enableQueryLog();
});
Laravel зберігає всі запити в пам'яті. Так що в деяких випадках, наприклад, коли вставляти велику кількість рядків або тривати завдання з великою кількістю запитів, це може спричинити використання додатком зайвої пам'яті.
У більшості випадків вам потрібен журнал запитів лише для налагодження, і якщо це так, я рекомендую вам включити його лише для розробки.
if (App::environment('local')) {
// The environment is local
DB::enableQueryLog();
}
Список літератури
\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
DB::listen
функція зворотного дзвінка має іншу підпис. Це більше так: DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
Якщо все, що вас справді цікавить, - це власний запит (останній запуск) для швидкої налагодження:
DB::enableQueryLog();
# your laravel query builder goes here
$laQuery = DB::getQueryLog();
$lcWhatYouWant = $laQuery[0]['query']; # <-------
# optionally disable the query log:
DB::disableQueryLog();
зробити print_r()
ON , $laQuery[0]
щоб отримати повний запит, в тому числі і кріплень. ( $lcWhatYouWant
змінна, наведена вище, змінює змінні на ??
)
Якщо ви використовуєте щось інше, ніж основне з'єднання mysql, вам потрібно буде скористатися цим:
DB::connection("mysql2")->enableQueryLog();
DB::connection("mysql2")->getQueryLog();
(з назвою вашого з'єднання, де "mysql2")
Помістіть це у файл route.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>';
});
Надіслано msurguy, вихідний код на цій сторінці . Цей виправлений код для laravel 5.2 ви знайдете у коментарях.
Спочатку потрібно ввімкнути журнал запитів
DB::enableQueryLog();
Тоді ви можете отримати журнали запитів, просто:
dd(DB::getQueryLog());
Було б краще, якщо ви включите журнал запитів перед запуском програми, що можна зробити в програмі BeforeMiddleware, а потім отримати виконані запити в AfterMiddleware.
Мабуть, із Laravel 5.2, закриття DB::listen
отримує лише один параметр.
Отже, якщо ви хочете використовувати DB::listen
Laravel 5.2, вам слід зробити щось на кшталт:
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);
}
);
Для laravel 5.8 ви просто додаєте dd або dump .
Наприклад:
DB::table('users')->where('votes', '>', 100)->dd();
або
DB::table('users')->where('votes', '>', 100)->dump();
Використовуйте toSql()
замість get()
цього:
$users = User::orderBy('name', 'asc')->toSql();
echo $users;
// Outputs the string:
'select * from `users` order by `name` asc'
Продовжуючи мабуть з Laravel 5.2, закриття в БД :: прослуховування отримує лише один параметр ... відповідь вище: ви можете помістити цей код у сценарій Middleware та використовувати його у маршрутах.
Додатково:
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);
Цей код призначений для:
Ось код, який базується на відповіді @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();
}
});
Основним є if(stripos...
рядок, який запобігає рекурсії вставки insert into log
оператора sql в базу даних.
Я думаю, що відповідь міститься в цій статті: https://arjunphp.com/laravel-5-5-log-eloquent-queries/
швидко та просто досягти журналу запитів.
Ви просто повинні додати до AppServiceProvider
в boot
методі зворотного виклику для прослуховування запитів БД:
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));
});
}
}
Припустимо, ви хочете надрукувати SQL-запит наступних операторів.
$user = User::find(5);
Вам просто потрібно зробити наступне:
DB::enableQueryLog();//enable query logging
$user = User::find(5);
print_r(DB::getQueryLog());//print sql query
Це надрукує останній виконаний запит у Laravel.
Для laravel 5 і далі, використовуючи лише DB :: getQueryLog (), це не буде робити. За замовчуванням у цьому значенні
protected $loggingQueries = false;
змінити його на
protected $loggingQueries = true;
у файлі нижче для запиту реєстрації.
/vendor/laravel/framework/src/illuminate/Database/Connection.php
І тоді ми можемо скористатись тим, DB::getQueryLog()
де ви хочете роздрукувати запит.
vendor
файли. Вони повинні зберігатися в оригіналі.