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

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

например:

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

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

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

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

20 ответов


Laravel 4

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

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

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


что Laravel 3

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

DB::last_query();

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


вы можете включить "профайлер " в Laravel 3, установив

'profiler' => true,

в своем application/config/application.php и application/config/database.php

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

enter image description here


для красноречивых вы можете просто сделать:

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

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


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

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

enter image description here


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


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

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

        return $queries;
    }

Примечание: установить $all флаг false если вы хотите только последний SQL-запрос.

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

dd(DBH::q()); 

вот результат, который я получаю: enter image description here

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


для Laraver 4 это

DB::getQueryLog()

вот быстрый фрагмент 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>

фреймворк 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] тестирование.DEBUG: Query 0: {"query": "select * from 'users' where ('user_id'= ?) ", "bindings": ["9"],"time": 0.23}

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


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

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

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


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

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

, либо более,:

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

или в качестве альтернативы Laravel 3 profiler вы можете использовать:

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. Он будет записывать запросы в журнал info (storage/log/laravel.log).


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

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


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

  1. добавить "loic-sharma/profiler": "1.1.*" в разделе require в композиторе.в JSON
  2. выполнить самообновление=>php composer.phar self-update в консоли.
  3. выполнить обновление композитора=>php composer.phar update loic-sharma/profiler в консоли `
  4. добавить 'Profiler\ProfilerServiceProvider', в массиве провайдера в приложение.в PHP
  5. добавить 'Profiler' => 'Profiler\Facades\Profiler', in этот aliasses массива в приложение.PHP как хорошо
  6. Run php artisan config:publish loic-sharma/profiler в консоли

последний запрос print

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

Л4 одну строчку

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

$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 просто переименуйте любое имя столбца, он покажет вам ошибку с вашим запросом.. :)