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

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

Например:

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

Или (posts (id, user_id, ...))

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

Или … Как я могу сохранить в журнале, все выполненные запросы.

Laravel 4

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

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

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


Laravel 3

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

 DB::last_query(); 

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

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

 'profiler' => true, 

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

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

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

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

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

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

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

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

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

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


     public static function q ($ all = true) 
     {
         $ queries = DB :: getQueryLog ();

         if ($ all == false) {
             $ last_query = end ($ queries);
             return $ last_query;
         }

         return $ query;
     }

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

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

 dd(DBH::q()); 

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

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

Для Laraver 4 это

 DB::getQueryLog() 

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

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

 <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> 

Laravel 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: Query 0: {"query": "select * from 'users' где ('user_id' =?)", "Bindings": ["9"] , "время": 0,23}

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

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

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

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

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

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

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

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

Или как альтернатива профилировщику laravel 3 вы можете использовать:

https://github.com/paulboco/profiler или https://github.com/barryvdh/laravel-debugbar

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

 \DB::enableQueryLog(); 

в 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 ).

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

поместите его в global.php, он будет записывать ваш запрос sql.

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

  1. Добавьте "loic-sharma/profiler": "1.1.*" В разделе require в composer.json
  2. Выполните самообновление => php composer.phar self-update в консоли.
  3. Выполните обновление композитора => 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 в консоли

Последний запрос печати

 $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); 

L4 однострочный

(который пишет запрос):

$q=\DB::getQueryLog();dd(end($q));

Laravel 3

Другой способ сделать это:

 #config/database.php 'profiler' => true 

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

 print_r(DB::profiler()); 

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

 print_r(DB::last_query()); 

Чтобы получить последний выполненный запрос в 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 .

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