Отримайте запит у 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?


як щодо laravel 5?
Chaudhry Waqas

Відповіді:


318

Laravel 4+

У Laravel 4 і пізніших версіях вам потрібно зателефонувати, DB::getQueryLog()щоб отримати всі запущені запити.

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

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

Примітка для користувачів Laravel 5: Вам потрібно буде зателефонувати DB::enableQueryLog()перед виконанням запиту. Або над рядком, який виконує запит, або всередині проміжного програмного забезпечення.


Laravel 3

У Laravel 3 ви можете отримати останній виконаний запит із Eloquentмоделі, що викликає статичний метод last_queryу DBкласі.

DB::last_query();

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


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

Мій поганий, правильний метод getQueryLog. Виправлено це зараз. Дякую!
rmobis

Дивно ... Я отримую, що last_query () не визначено в помилці об'єкта Query. Я просто закликаю до необґрунтованої красномовної моделі.
Адітя МП

1
Для Laravel 3 це фактично DB :: last_query (); Вам також потрібно встановити "профіль" на "true" у своїй програмі / config / database.php
Dan Smart

4
Схоже, це не працює для красномовної моделі на L4. Коли я виконую Model: find ($ id) і виконую DB: getQueryLog () повернути порожній масив (). Будь-яка ідея, як отримати запити для красномовної моделі?
Абішек

31

Ви можете включити " Профілер " у Laravel 3, встановивши налаштування

'profiler' => true,

У вашому application/config/application.phpіapplication/config/database.php

Це вмикає панель у нижній частині кожної сторінки. Однією з його особливостей є перелік виконаних запитів та тривалість кожного з них.

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


14
Зауважте, що в Laravel 4 Профілер не включений, його потрібно встановити самостійно (наприклад, використовуючи композитор). Див це так питання .
подвійність_

1
Це обговорюється в першій відповіді там .
подвійність_

24

Для красномовного ви можете просто зробити:

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

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


17

Я рекомендую використовувати Clockwork для розширення Chrome з пакетом Laravel https://github.com/itsgoingd/ clockwork . Встановити та використовувати це просто.

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

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


16

Оскільки профайлера ще немає в Laravel 4 , я створив цю помічну функцію, щоб побачити генерується SQL:

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

        if ($ all == false) {
            $ last_query = end ($ запитів);
            повернути $ last_query;
        }

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

ПРИМІТКА . Установіть прапор $ all на значення false, якщо вам потрібен лише останній SQL-запит.

Я зберігаю такі функції в класі, який називається DBH.php (скорочується для помічника бази даних), тому я можу викликати його з будь-якого місця:

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 queries = "json output";
mydoglixu

@mydoglixu Ви цього не зробите, оскільки масив (або об'єкт) JSON є дійсним JavaScript. Він би зламався, якби ти.
rmobis

@mobis - о так, Дух
mydoglixu

10

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

Профілер Loic Sharma SQL підтримує Laravel 4, я тільки що встановив його. Тут наведено інструкції . Кроки такі:

  1. Додайте "loic-sharma/profiler": "1.1.*"в розділ "вимагати" в 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',також масив псевдонімів у 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

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


Здається, ваша відповідь не сприяє новим знанням того, що прийнята відповідь Рафаеля_ вже охоплює.
Jaak Kütt

0

Це дуже простий спосіб зробити це, з вашого запиту на laravel просто перейменуйте будь-яке ім’я стовпця, воно покаже вам помилку з вашим запитом .. :)


Швидкий хакітський спосіб. Не корисний у виробництві, але в режимі розробки це добре в деяких випадках.
замість цього
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.