Получить запрос, выполненный в Laravel 3/4


182

Как я могу получить необработанный SQL-запрос в Laravel 3/4, используя Laravel Query Builder или Eloquent ORM?

Например, что-то вроде этого:

DB::table('users')->where_status(1)->get();

Или:

(posts (id, user_id, ...))

User::find(1)->posts->get();

Иначе, как минимум, как сохранить все выполненные запросы в laravel.log?


что насчет 5-го уровня?
Чаудхри Вакас

Ответы:


318

Ларавел 4+

В Laravel 4 и позже вам нужно позвонить, DB::getQueryLog()чтобы получить все запущенные запросы.

$queries = DB::getQueryLog();
$last_query = end($queries);

Или вы можете скачать пакет профилировщика. Я бы порекомендовал barryvdh / laravel-debugbar , который довольно хорош . Вы можете прочитать инструкции по установке в их хранилище .

Примечание для пользователей Laravel 5: Вам нужно позвонить DB::enableQueryLog()перед выполнением запроса. Либо чуть выше строки, выполняющей запрос, либо внутри промежуточного программного обеспечения.


Ларавел 3

В Laravel 3, вы можете получить последний выполненный запрос от Eloquentмодели вызова статического метода last_queryна DBклассе.

DB::last_query();

Это, однако, требует, чтобы вы включили profilerопцию в application/config/database.php. В качестве альтернативы вы можете, как упоминалось в @dualed, включить profilerопцию in application/config/application.phpили call, DB::profile()чтобы все запросы выполнялись в текущем запросе и время их выполнения.


2
Ваш код для Laravel 4 не работает. Я получаю это ErrorException: Предупреждение: call_user_func_array()ожидает, что параметр 1 будет действительным обратным вызовом, у класса Illuminate\Database\MySqlConnectionнет метода getQueryList.
двойственность_

Мой плохой, правильный метод есть getQueryLog. Исправлено сейчас. Спасибо!
rmobis

Странно ... Я получаю, что last_query () не определен при ошибке объекта Query. Я просто призываю к необоснованной модели Eloquent.
депутат Адитья

1
Для Laravel 3 это фактически DB :: last_query (); Вы также должны установить для «профиля» значение true в своем приложении / config / database.php
Дан Смарт,

4
Похоже, это не работает для Eloquent Model на L4. Когда я выполняю Model :: find ($ id) и выполняю DB :: getQueryLog (), возвращаю пустой массив (). Есть идеи, как получить запросы для Eloquent Model?
Абишек

31

Вы можете включить « Профилировщик » в Laravel 3, установив

'profiler' => true,

В вашем application/config/application.phpиapplication/config/database.php

Это позволяет панель внизу каждой страницы. Одна из его функций - перечисление выполненных запросов и продолжительность каждого из них.

введите описание изображения здесь


14
Обратите внимание, что в Laravel 4, Profiler не включен, вы должны установить его самостоятельно (например, с помощью composer). Смотрите этот ТАК вопрос .
двойственность_

1
Это обсуждается в первом ответе там .
Duality__

24

Для Eloquent вы можете просто сделать:

$result->getQuery()->toSql();

Но вам нужно удалить часть «-> get ()» из вашего запроса.


17

Я бы порекомендовал использовать расширение Chrome Clockwork с пакетом Laravel https://github.com/itsgoingd/clockwork . Это легко установить и использовать.

Clockwork - это расширение Chrome для разработки PHP, расширяющее Инструменты разработчика новой панелью, предоставляющей все виды информации, полезной для отладки и профилирования ваших PHP-скриптов, включая информацию по запросу, заголовки, данные GET и POST, файлы cookie, данные сеанса, запросы к базе данных, маршруты, визуализация времени выполнения приложения и многое другое. Clockwork включает в себя встроенную поддержку приложений на основе Laravel 4 и Slim 2, вы можете добавить поддержку любой другой или пользовательской инфраструктуры через расширяемый API.

введите описание изображения здесь


16

Поскольку профилировщик еще не реализован в Laravel 4 , я создал эту вспомогательную функцию, чтобы увидеть генерируемый SQL:

    публичная статическая функция q ($ all = true) 
    {
        $ query = DB :: getQueryLog ();

        if ($ all == false) {
            $ last_query = end ($ query);
            вернуть $ last_query;
        }

        вернуть $ запросов;
    }

ПРИМЕЧАНИЕ . Установите для флага $ all значение false, если требуется только последний запрос SQL.

Я храню такого рода функции в классе DBH.php (сокращение от Database Helper), поэтому я могу вызывать его из любого места, например:

dd(DBH::q()); 

Вот результат, который я получаю: введите описание изображения здесь

Если вам интересно, я использую Kint для форматирования dd (). http://raveren.github.io/kint/


1
if($all == false)? Почему бы простоif(!$all)
toesslab


14

Вот небольшой фрагмент кода Javascript, который вы можете добавить в шаблон главной страницы. Пока он включен, все запросы будут выводиться на консоль Javascript вашего браузера. Он печатает их в легко читаемом списке, что позволяет легко просматривать ваш сайт и видеть, какие запросы выполняются на каждой странице.

Когда вы закончите отладку, просто удалите ее из шаблона.

<script type="text/javascript">
    var queries = {{ json_encode(DB::getQueryLog()) }};
    console.log('/****************************** Database Queries ******************************/');
    console.log(' ');
    queries.forEach(function(query) {
        console.log('   ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
    });
    console.log(' ');
    console.log('/****************************** End Queries ***********************************/');
</script>

Я думаю, что вам нужно "" вокруг части {{json_encode ...}}
mydoglixu

@mydoglixu Так как DB::getQueryLog()возвращает массив, нет необходимости заключать его в "". json_encodeпереведу это соответственно.
rmobis

@mobis - я имел в виду, что вам нужно "" вне {{...}}, чтобы JavaScript не выдавал ошибку. вот так: var запросы = "вывод json";
mydoglixu

@mydoglixu Нет, потому что массив JSON (или объект) является допустимым JavaScript. Это сломалось бы, если бы ты сделал.
rmobis

@mobis - о да,
дух

10

Ларавел 5

Обратите внимание, что это процедурный подход, который я использую для быстрой отладки

    DB::enableQueryLog();

    // Run your queries
    // ...

    // Then to retrieve everything since you enabled the logging:
    $queries = DB::getQueryLog();
    foreach($queries as $i=>$query)
    {
        Log::debug("Query $i: " . json_encode($query));
    }

в заголовке используйте:

     use DB;
     use Illuminate\Support\Facades\Log;

Вывод будет выглядеть примерно так (файл журнала по умолчанию - laravel.log ):

[2015-09-25 12:33:29] testing.DEBUG: Запрос 0: {"query": "select * from 'users' where ('user_id' =?)", "Bindings": ["9"] , "время": 0,23}

*** Я знаю, что этот вопрос задан Laravel 3/4, но эта страница появляется при поиске общего ответа. Новички в Laravel могут не знать, что есть разница между версиями. Поскольку я не вижу DD::enableQueryLog()упоминаний ни в одном из ответов, которые обычно нахожу, это может быть связано с Laravel 5 - возможно, кто-то может прокомментировать это.


7

Вы также можете прослушивать события запроса, используя это:

DB::listen(function($sql, $bindings, $time)
{
    var_dump($sql);
});

См. Информацию в документации здесь в разделе « Прослушивание событий запроса».


6

Использование журнала запросов не дает фактического выполняемого запроса RAW, особенно если есть связанные значения. Это лучший подход для получения исходного SQL:

DB::table('tablename')->toSql();

или более вовлечены:

$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);

5

Если вы используете Laravel 5, вам нужно вставить это перед запросом или в промежуточное ПО:

\DB::enableQueryLog();


3

в Laravel 4 вы можете использовать приемник событий для запросов к базе данных.

Event::listen('illuminate.query', function($sql, $bindings)
{
    foreach ($bindings as $val) {
        $sql = preg_replace('/\?/', "'{$val}'", $sql, 1);
    }

    Log::info($sql);
});

Разместите этот фрагмент где угодно, например, в start/global.php. Запишет запросы в информационный журнал ( storage/log/laravel.log).


3
Event::listen('illuminate.query', function($sql, $param)
{
    \Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});

поместите его в global.php, он запишет ваш sql запрос.


2

Профилировщик SQL Loic Sharma поддерживает Laravel 4, я только что установил его. Инструкции перечислены здесь . Шаги следующие:

  1. Добавьте "loic-sharma/profiler": "1.1.*"в обязательный раздел в composer.json
  2. Выполните самообновление => php composer.phar self-updateв консоли.
  3. Также выполните обновление composer => php composer.phar update loic-sharma/profilerв консоли.
  4. Добавьте 'Profiler\ProfilerServiceProvider',в массив провайдера в app.php
  5. Также 'Profiler' => 'Profiler\Facades\Profiler',добавьте массив aliasses в app.php
  6. Запустить php artisan config:publish loic-sharma/profilerв консоли

2

Печать последнего запроса

$queries = \DB::getQueryLog();
$last_query = end($queries);

// Add binding to query
foreach ($last_query['bindings'] as $val) {
        $last_query['query'] = preg_replace('/\?/', "'{$val}'", $last_query['query'], 1);
}
dd($last_query);


0

Ларавел 3

Еще один способ сделать это:

#config/database.php

'profiler' => true

Для всех запросов результат:

print_r(DB::profiler());

Для последнего результата:

print_r(DB::last_query());

0

Чтобы получить последний выполненный запрос в laravel, мы будем использовать DB::getQueryLog()функцию laravel, которая возвращает все выполненные запросы. Для получения последнего запроса мы будем использовать end()функцию, которая возвращает последний выполненный запрос.

$student = DB::table('student')->get();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);

Я взял ссылку с http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php .


Ваш ответ, кажется, не вносит каких-либо новых знаний в то, что уже охватывает принятый ответ Raphael_.
Яак Кютт

0

Есть очень простой способ сделать это: из вашего запроса laravel просто переименуйте любое имя столбца, он покажет вам ошибку с вашим запросом .. :)


Быстрый хакерский путь. Не полезно в производстве, но в режиме разработки в некоторых случаях это нормально.
вместо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.