Как я могу получить выполненный запрос в 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 вам нужно вызвать DB::getQueryLog()
чтобы получить все DB::getQueryLog()
запросы.
$queries = DB::getQueryLog(); $last_query = end($queries);
Или вы можете загрузить пакет профилировщика. Я бы рекомендовал barryvdh / laravel-debugbar , который довольно опрятен . Вы можете прочитать инструкции по установке в своем репозитории .
В 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>
Обратите внимание, что это процедурный подход, который я использую для быстрой отладки
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, я только что установил его. Инструкции перечислены здесь . Эти шаги заключаются в следующем:
"loic-sharma/profiler": "1.1.*"
В разделе require в composer.json php composer.phar self-update
в консоли. php composer.phar update loic-sharma/profiler
в консоли, а также ` 'Profiler\ProfilerServiceProvider',
в массиве поставщиков в app.php 'Profiler' => 'Profiler\Facades\Profiler',
в массив aliasses в app.php, а также 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);
(который пишет запрос):
$q=\DB::getQueryLog();dd(end($q));
Другой способ сделать это:
#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 просто переименуйте любое имя столбца, оно покажет вам ошибку с вашим запросом .. 🙂