Выполните запрос в Laravel 3/4

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

Например, примерно так:

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

Or:

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

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

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


person Patrick Maciel    schedule 26.01.2013    source источник
comment
как насчет Laravel 5?   -  person Chaudhry Waqas    schedule 26.08.2015
comment
@ Адамник здесь: stackoverflow.com/questions/27753868/   -  person Patrick Maciel    schedule 26.08.2015


Ответы (21)


Laravel 4+

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

В 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();

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

person rmobis    schedule 26.01.2013
comment
Ваш код для Laravel 4 не работает. Я получаю это ErrorException: Предупреждение: call_user_func_array() ожидает, что параметр 1 будет действительным обратным вызовом, класс Illuminate\Database\MySqlConnection не имеет метода getQueryList. - person duality_; 05.03.2013
comment
Мое плохое, правильный метод - getQueryLog. Исправлено сейчас. Спасибо! - person rmobis; 05.03.2013
comment
Странно ... Я получаю, что last_query () не определен в ошибке объекта запроса. Я просто обращаюсь к необоснованной модели Eloquent. - person Aditya M P; 15.04.2013
comment
Для Laravel 3 это фактически DB :: last_query (); Вам также необходимо установить для параметра profile значение true в файле application / config / database.php. - person Dan Smart; 16.04.2013
comment
Похоже, это не работает для красноречивой модели на L4. Когда я выполняю Model :: find ($ id) и выполняю DB :: getQueryLog (), возвращаю пустой массив (). Есть идеи, как получить запросы для красноречивой модели? - person Abishek; 13.05.2013
comment
дд (конец (DB :: getQueryLog ())); - person MECU; 30.04.2014
comment
L4 одиночный вкладыш: $q=\DB::getQueryLog();dd(end($q)); - person Kamil Kiełczewski; 19.07.2016
comment
@ KamilKiełczewski, разве это не просто более длинная версия ответа MECU? Я действительно не вижу в этом смысла. - person rmobis; 20.07.2016
comment
Ответ @rmobis MECU не работает в моем проекте L4 - поэтому я поставил свою версию. Может быть ответ MECU работает на L3 или L5 (?) - person Kamil Kiełczewski; 20.07.2016
comment
@ KamilKiełczewski он просто забыл \ перед DB::getQueryLog(). В остальном они идентичны. - person rmobis; 20.07.2016
comment
@rmobis - нет у меня другая ошибка - попробуйте сами. возникла проблема с завершением (здесь_must_be_veraiable_not_function) - person Kamil Kiełczewski; 20.07.2016
comment
@ KamilKiełczewski О, ты прав. Это потому, что аргумент end передается по ссылке, поэтому он должен быть реальной переменной. Хороший улов. - person rmobis; 21.07.2016
comment
@rmobis хорошо, так что, пожалуйста, дайте точку в моем комментарии с помощью oneliner, чтобы его лучше видели другие люди :) - person Kamil Kiełczewski; 21.07.2016
comment
в Laravel 3 длинные запросы усекаются, есть идея? - person qwertzman; 02.03.2018
comment
Я становлюсь постоянным посетителем этой страницы. - person Jovylle Bermudez; 09.07.2021

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

'profiler' => true,

В ваших application/config/application.php и application/config/database.php

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

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

person dualed    schedule 26.01.2013
comment
Обратите внимание, что в Laravel 4 Profiler не включен, вы должны установить его самостоятельно (например, используя композитор). См. этот вопрос SO. - person duality_; 05.03.2013
comment
Это обсуждается в первом ответе там. - person duality_; 24.02.2014

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

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

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

person JamesPlayer    schedule 25.07.2014

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

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

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

person Znarkus    schedule 29.07.2014

Поскольку профилировщик еще не реализован в 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()); 

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

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

person Ricardo Rossi    schedule 14.06.2013
comment
if($all == false)? Почему бы просто не if(!$all) - person toesslab; 22.02.2016

Для Laraver 4 это

DB::getQueryLog()
person misaizdaleka    schedule 18.03.2013

Вот небольшой фрагмент кода 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>
person Adam    schedule 30.09.2013
comment
Думаю, вам понадобится часть {{json_encode ...}} - person mydoglixu; 01.06.2015
comment
@mydoglixu Поскольку DB::getQueryLog() возвращает массив, нет необходимости окружать его. json_encode переведет это соответствующим образом. - person rmobis; 30.06.2015
comment
@mobis - я имел в виду, что вам нужно внешнее {{...}}, чтобы javascript не вызывал ошибку. вот так: var query = json output; - person mydoglixu; 30.06.2015
comment
@mydoglixu Нет, потому что массив (или объект) JSON является допустимым JavaScript. Если бы ты это сделал, он бы сломался. - person rmobis; 01.07.2015
comment
@mobis - о да, да - person mydoglixu; 07.07.2015

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: Запрос 0: {"query": "select * from 'users' where ('user_id' =?)", "Bindings": ["9"] , "время": 0,23}

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

person Bryan    schedule 25.09.2015

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

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

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

person SnapShot    schedule 20.06.2014

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

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

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

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

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

\DB::enableQueryLog();
person Mandeep Gill    schedule 27.01.2016

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

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

person karelv    schedule 10.11.2013

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

person aebersold    schedule 07.08.2014

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

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

person Christland    schedule 09.12.2014

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

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

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

$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);
person Dulitha Kumarasiri    schedule 13.02.2015

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

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

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

person Kamil Kiełczewski    schedule 02.08.2017

Laravel 3

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

#config/database.php

'profiler' => true

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

print_r(DB::profiler());

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

print_r(DB::last_query());
person Wallace Maxters    schedule 24.03.2015

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

person Manish    schedule 17.05.2015
comment
Ваш ответ, похоже, не привносит никаких новых знаний к тому, что уже охватывает принятый ответ Рафаэля. - person Jaak Kütt; 18.05.2015

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

person Aamir    schedule 26.11.2016
comment
Быстрый хакерский способ. Бесполезно в продакшене, но в режиме разработки в некоторых случаях нормально. - person instead; 28.05.2018

В Laravel 8.x вы можете прослушивать событие, зарегистрировав прослушиватель запросов у поставщика услуг, как описано в laravel.com.

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

public function boot()
{
   
  DB::listen(function ($query) {            
   Log::debug("SQL : " . $query->sql);
  });

}

Затем вы можете увидеть все запросы в файле laravel.log внутри storage\logs\laravel.log

person Nava Bogatee    schedule 18.11.2020