Як я можу отримати засіб для створення запитів для виведення його сирого SQL-запиту як рядка?


544

Дано наступний код:

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

Я хочу отримати необроблену рядок запитів SQL, яку буде генерувати вищевказаний конструктор баз даних. У цьому прикладі це було б SELECT * FROM users.

Як це зробити?


14
Laravel Eloquent ORM отримує непростий запит:echo User::where('status', 1)->toSql();
Мухаммед Шахзад

Я використовую пакет для Laravel - Telescope, він записує всі запити та робить багато інших речей.
Вінса

Відповіді:


658

Щоб вивести на екран останні запущені запити, ви можете скористатися цим:

DB::enableQueryLog(); // Enable query log

// Your Eloquent query executed by using get()

dd(DB::getQueryLog()); // Show results of log

Я вірю, що останні запити будуть в нижній частині масиву.

У вас вийде щось подібне:

array(1) {
  [0]=>
  array(3) {
    ["query"]=>
    string(21) "select * from "users""
    ["bindings"]=>
    array(0) {
    }
    ["time"]=>
    string(4) "0.92"
  }
}

(Завдяки коментарю Джошуа нижче.)


2
хмм їм не впевнений , але ви можете бути в змозі accompish то , що ви хочете з композитором пакета stackoverflow.com/a/17339752/813181
jfortunato

9
Можливо, ще краще вивести його в журнал вашої програми за допомогою Logкласу: Log::debug(DB::getQueryLog())
msturdy

35
Можливо, вам доведеться ввімкнути це, оскільки воно за замовчуванням вимкнено. Ви можете скористатися цією командою, щоб тимчасово увімкнути її:DB::enableQueryLog();
Джошуа Фріке

5
Я спробував вашу відповідь. Що я спробував, DB::enableQueryLog(); dd(DB::getQueryLog());але це повертається просто []....
Я найдуріша людина

6
Якщо у вас є кілька баз даних, можливо, вам доведеться це зробитиDB::connection('database')->getQueryLog()
Damien Ó Ceallaigh,

745

Використовуйте toSql()метод на QueryBuilderекземплярі.

DB::table('users')->toSql() повернеться:

виберіть * від `користувачів`

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


6
Я думаю, що це найпростіший спосіб, коли використовувати Eloquent поза Laravel
Gab

8
@Stormsson Це неможливо, оскільки PHP ніколи не замінює запит із прив'язкою до їх значень. Щоб отримати запити в повному обсязі, вам потрібно увійти в систему з MySQL. Тут є додаткова інформація: stackoverflow.com/questions/1786322/…
Метью

40
@Stormsson ви можете використовувати getBindingsметод. Це поверне прив'язки для того, щоб вони були прив'язані до оператора SQL.
danronmoon

2
Дуже корисно для налагодження складних запитів, які Eloquent відмовляється запускати, оскільки ті не відображаються в журналі запитів.
BobChao87

34
Щоб отримати запит з bindinds$query = \DB::table('users')->where('id', 10); $sql = str_replace_array('?', $query->getBindings(), $query->toSql()); dd($sql);
Ennio Sousa

88

DB::QueryLog()працювати лише після виконання запиту $builder->get(). якщо ви хочете отримати запит перед виконанням запиту, ви можете використовувати $builder->toSql()метод. це приклад, як отримати sql та зв’язати його:

    $query = str_replace(array('?'), array('\'%s\''), $builder->toSql());
    $query = vsprintf($query, $builder->getBindings());
    dump($query);

    $result = $builder->get();

АБО просто зробіть помилку запиту, як-от заклик до неіснуючої таблиці чи стовпця, і ви побачите згенерований запит за винятком XD


3
Це, безумовно, найкраща відповідь, проста і прямо до суті. Дякую :)
Sobakus

18
Як $query = vsprintf(str_replace(array('?'), array('\'%s\''), $builder->toSql()), $builder->getBindings());
однолінійний

Це повинно бути включене в рамки як
основна

Зауважте, що це не спрацює, якщо у вашому запиті вже є знаки відсотка, наприклад, для LIKEзапиту або при форматуванні дат. Вам потрібно буде уникнути перших, що мають подвійні відсотки знаків.
Невідомий Dev

Чи є проблеми з безпекою при цьому? Чи пов'язуються санітарні засоби $builder->getBindings()?
солідау

56

Ви можете прослухати подію "освітлити.запит". Перед запитом додайте наступного слухача подій:

Event::listen('illuminate.query', function($query, $params, $time, $conn) 
{ 
    dd(array($query, $params, $time, $conn));
});

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

Це надрукує щось на зразок:

array(4) {
  [0]=>
  string(21) "select * from "users""
  [1]=>
  array(0) {
  }
  [2]=>
  string(4) "0.94"
  [3]=>
  string(6) "sqlite"
}

1
Я отримую заклик до невизначеного методу Illuminate \ Database \ Query \ Builder :: liste () в Laravel 4
Miguel Stevens

2
Спасибі це чудово. Добре зауважити, що dd - це функція, яка виробляє дамп заданої змінної та завершує виконання сценарію, а також імпортує подію, включаючиuse Illuminate\Support\Facades\Event;
radtek

1
@radtek: Замість цього use Illuminate\Support\Facades\Event;ви можете просто зробити, use Event;оскільки це фасад .
TachyonVortex

50

Якщо ви намагаєтеся отримати Журнал за допомогою Illuminate без використання Laravel:

\Illuminate\Database\Capsule\Manager::getQueryLog();

Ви також можете відключити швидку функцію, наприклад:

function logger() {
    $queries = \Illuminate\Database\Capsule\Manager::getQueryLog();
    $formattedQueries = [];
    foreach( $queries as $query ) :
        $prep = $query['query'];
        foreach( $query['bindings'] as $binding ) :
            $prep = preg_replace("#\?#", is_numeric($binding) ? $binding : "'" . $binding . "'", $prep, 1);
        endforeach;
        $formattedQueries[] = $prep;
    endforeach;
    return $formattedQueries;
}

EDIT

Оновлені версії, здається, журнал запитів вимкнено за замовчуванням (вищезазначений повертає порожній масив). Щоб увімкнути функцію, під час ініціалізації диспетчера капсул, схопіть екземпляр з'єднання та викликайте enableQueryLogметод

$capsule::connection()->enableQueryLog();

РЕДАКТУЙТЕ ПРОТИ

Враховуючи власне питання, ви фактично можете зробити наступне для перетворення поточного єдиного запиту замість усіх попередніх запитів:

$sql = $query->toSql();
$bindings = $query->getBindings();

я отримую такий тип повернення із запиту "name = [{" name ":" rifat "}]" що мені потрібно зробити, щоб отримати лише "name = rifat"?
безтілесний

Я б роздрукував ваші прив’язки, схоже на те, що ви передаєте масив замість рядка
Люк Сноуден

Це корисний початок, але, здається, нехтуємо додавати одиничні лапки навколо параметризованих значень, наприклад, коли я передаю рядок типу 'US/Eastern'.
Райан

1
@ Райан, це правда, тому я і заявив quick function. Я вважаю , що основною код буде використовувати підготовки ( php.net/manual/en/mysqli.prepare.php ) методи, тому просто ?необхідно. Ви можете php.net/manual/en/function.is-numeric.php визначити, чи слід інкапсулювати вхід у межах однієї лапки.
Люк Сноуден

1
@LukeSnowden Ваша відповідь геніальна! Нарешті я знайшов час спробувати вашу нову версію (яку я редагував вище, щоб включити вашу is_numericідею), і вона працює! Мені це подобається. Дякую.
Райан

36

Існує красномовний метод отримання рядка запиту.

toSql ()

у нашому випадку,

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

повернення

select * from users

це точне рішення, яке повертає рядок запиту SQL.


11
як щодо прив'язки запитів? наприклад, коли ви робите ->where('foo', '=', 'bar')
бальне звичаєне

28
$data = User::toSql();
echo $data; //this will retrun select * from users. //here User is model

Це набагато точніше, контролюється і відповідає потребі питання.
Бенджамінхул

Дякую за Ваш коментар
Kuldeep Mishra

2
Ви можете додати так, ->toSql()як це зробите, якщо після моделі буде більше аргументів. наприкладUser::where('id', 1)->toSql()
Тобі Меллор

24

Якщо ви використовуєте laravel 5.1 і MySQL, ви можете використовувати цю функцію, зроблену мною:

/*
 *  returns SQL with values in it
 */
function getSql($model)
{
    $replace = function ($sql, $bindings)
    {
        $needle = '?';
        foreach ($bindings as $replace){
            $pos = strpos($sql, $needle);
            if ($pos !== false) {
                if (gettype($replace) === "string") {
                     $replace = ' "'.addslashes($replace).'" ';
                }
                $sql = substr_replace($sql, $replace, $pos, strlen($needle));
            }
        }
        return $sql;
    };
    $sql = $replace($model->toSql(), $model->getBindings());

    return $sql;
}

Як вхідний параметр ви можете використовувати будь-який з них

Освітлити \ База даних \ Красномовний \ Будівельник

Освітліть \ База даних \ Красномовні \ Відносини \ HasMany

Освітлити \ База даних \ Запит \ Builder


Відповідь вдосконалена, щоб включити всі зауваження, зроблені в коментарях. Дуже дякую.
Євген Афанасьєв

13

Спочатку вам потрібно буде включити журнал запитів, зателефонувавши:

DB::enableQueryLog();

після запитів за допомогою фасаду БД ви можете написати:

dd(DB::getQueryLog());

вихід сподобається нижче:

array:1 [▼
  0 => array:3 [▼
    "query" => "select * from `users` left join `website_user` on `users`.`id` = `website_user`.`user_id` left join `region_user` on `users`.`id` = `region_user`.`user_id` left ▶"
    "bindings" => array:5 [▶]
    "time" => 3.79
  ]
]

дуже корисна відповідь
Anoop PS

привіт, я використав $ result = DB :: select ('select * from sqrt_user_modules where user_id =: id', ['id' => $ user]); БД :: enableQueryLog (); але ви не отримали жодного виводу dd (DB :: getQueryLog ());
Anoop PS

чи потрібно нам включати будь-яку бібліотеку
Anoop PS

1
Крок 1: DB :: enableQueryLog (); крок 2: $ result = DB :: select ('select * from sqrt_user_modules where user_id =: id', ['id' => $ user]); крок 3: dd (DB :: getQueryLog ());
Раві Мане

12

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

// query builder
$query = DB::table('table_name')->where('id', 1);

// binding replaced
$sql = str_replace_array('?', $query->getBindings(), $query->toSql());

// for laravel 5.8^
$sql = Str::replaceArray('?', $query->getBindings(), $query->toSql());

// print
dd($sql);

10

Перший спосіб:

Просто ви можете робити наступні речі за допомогою toSql()методу,

$query = DB::table('users')->get();

echo $query->toSql();

Якщо це не працює, ви можете налаштувати річ з документації на laravel .

Другий спосіб:

Ще один спосіб це зробити

DB::getQueryLog()

але якщо він повертає порожній масив, він за замовчуванням відключений, відвідайте це ,

просто ввімкніть функцію DB::enableQueryLog()і вона буде працювати :)

для отримання додаткової інформації відвідайте випуск Github щоб дізнатися більше про нього.

Сподіваюся, це допомагає :)


10

«Macroable» заміна , щоб отримати SQL запит з кріпленнями.

  1. Додайте нижче макро функцію в метод.AppServiceProvider boot()

    \Illuminate\Database\Query\Builder::macro('toRawSql', function(){
        return array_reduce($this->getBindings(), function($sql, $binding){
            return preg_replace('/\?/', is_numeric($binding) ? $binding : "'".$binding."'" , $sql, 1);
        }, $this->toSql());
    });
  2. Додайте псевдонім для Красномовного будівельника. ( Laravel 5.4+ )

    \Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
        return ($this->getQuery()->toRawSql());
    });
  3. Потім налагоджуйте як завжди. ( Laravel 5.4+ )

    Наприклад, Builder Query

    \Log::debug(\DB::table('users')->limit(1)->toRawSql())

    Наприклад, красномовний будівельник

    \Log::debug(\App\User::limit(1)->toRawSql());

Примітка: від Laravel 5.1 до 5.3, оскільки Eloquent Builder не використовує Macroableознаку, не може додати toRawSqlпсевдонім до Eloquent Builder на ходу. Дотримуйтесь наведеного нижче прикладу, щоб досягти того ж.

Наприклад, красномовний будівельник ( Laravel 5.1 - 5.3 )

\Log::debug(\App\User::limit(1)->getQuery()->toRawSql());

Ой, я пізно пішов. Просто хочу надіслати відповідь за допомогою Macro. Це найприємніша відповідь. Має бути прийнята відповідь: D
nmfzone

Ви можете абстрагувати останнє у
Ogier Schelvis

8

використовувати пакет налагодження

composer require "barryvdh/laravel-debugbar": "2.3.*"

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


7

Від laravel 5.2і далі. ви можете використовувати DB::listenдля отримання запитів.

DB::listen(function ($query) {
    // $query->sql
    // $query->bindings
    // $query->time
});

Або якщо ви хочете налагодити один Builderекземпляр, тоді ви можете використовувати toSqlметод.

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

1
Слухати річ корисно, оголосити її перед запуском запиту та скинути sql & прив'язки в межах методу. Недосконалий, але працює швидше / простіше, ніж інші відповіді.
Андрій

7

Найпростіший спосіб - це зробити навмисну ​​помилку . Наприклад, я хочу побачити повний запит SQL наступного відношення:

 public function jobs()
        {
            return $this->belongsToMany(Job::class, 'eqtype_jobs')
                   ->withPivot(['created_at','updated_at','id'])
                   ->orderBy('pivot_created_at','desc');
        }

Я просто зробити стовпець, який не можна знайти, тут я вибрав created_atі змінив його created_ats, додавши трейлінг, sщоб бути:

public function jobs()
            {
                return $this->belongsToMany(Job::class, 'eqtype_jobs')
                       ->withPivot(['created_ats','updated_at','id'])
                       ->orderBy('pivot_created_at','desc');
            }

Отже, налагоджувач поверне наступну помилку:

(4/4) ErrorException SQLSTATE [42S22]: Column, не знайдено: 1054 Невідомі колонки 'eqtype_jobs.created_ats' в 'списку полів' (SQL: виберіть jobs*. eqtype_jobs. , set_idЯк pivot_set_id, eqtype_jobs. , job_idЯк pivot_job_id, eqtype_jobs. , created_ats Як pivot_created_ats, eqtype_jobs. , updated_atЯк pivot_updated_at, eqtype_jobs. , idЯк pivot_idз jobsвнутрішнє з'єднання eqtype_jobsз jobs. id= eqtype_jobs. , job_idде eqtype_jobs. set_id= 56 впорядкувати по pivot_created_atмежі по спадаючій 20 зміщення 0) (Вид: /home/said/www/factory/resources/views/set/show.blade.php)

Вищезгадане повідомлення про помилку повертає повний SQL-запит із помилкою

SQL: select  jobs.*, eqtype_jobs.set_id as pivot_set_id,  eqtype_jobs.job_id as pivot_job_id, eqtype_jobs.created_ats as pivot_created_ats, eqtype_jobs.updated_at as  pivot_updated_at, eqtype_jobs.id as pivot_id from jobs inner join eqtype_jobs on jobs.id = eqtype_jobs.job_id where  eqtype_jobs.set_id = 56 order by pivot_created_at desc limit 20 offset 0

Тепер просто видаліть зайве sз create_at і протестуйте цей SQL так, як вам подобається в будь-якому редакторі SQL, наприклад, phpMyAdmin SQL редакторі!

Зверніть увагу:

Розчин був протестований за допомогою Laravel 5.4 .


2
Це найкраща відповідь на сьогодні! Так просто! :)
Пікард

Це не відображатиме запит із прив’язками, тобто прив’язки будуть показуватись як:id
Shantha Kumara

@ShanthaKumara Дійсно, я не знаю, яка версія та конфігурація Laravel ви використовували. Однак кожен фрагмент чи код у моїй відповіді було скопійовано та вставлено з реального виводу коду проекту Laravel 5.4.
SaidbakR

6

Щоб побачити виконаний запит Laravel, використовуйте журнал запитів laravel

DB::enableQueryLog();

$queries = DB::getQueryLog();

6

Станом на Laravel 5.8.15 у розробника запитів є методи ddта dumpметоди, які ви можете зробити

DB::table('data')->where('a', 1)->dump();

Дякую. АД працює дуже добре. БД :: таблиця ('дані') -> де ('a', 1) -> dd ();
Вакас

Краще за інші перелічені відповіді.
Хамес А. Хан

5

Це функція, яку я розмістив у своєму базовому класі моделей. Просто перенесіть в нього об’єкт конструктора запитів, і рядок SQL буде повернуто.

function getSQL($builder) {
  $sql = $builder->toSql();
  foreach ( $builder->getBindings() as $binding ) {
    $value = is_numeric($binding) ? $binding : "'".$binding."'";
    $sql = preg_replace('/\?/', $value, $sql, 1);
  }
  return $sql;
}


4

Для laravel 5.5.X

Якщо ви хочете отримувати кожен запит SQL, виконаний вашою програмою, ви можете скористатися методом прослуховування. Цей метод корисний для реєстрації запитів або налагодження. Ви можете зареєструвати слухача запитів у постачальника послуг:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function ($query) {
            // $query->sql
            // $query->bindings
            // $query->time
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Джерело


4

Додайте цю функцію до своєї програми та просто зателефонуйте.

function getQuery($sql){
        $query = str_replace(array('?'), array('\'%s\''), $sql->toSql());
        $query = vsprintf($query, $sql->getBindings());     
        return $query;
}

Вихід : "виберіть * userзвідки lang= 'en' та status= '1' порядок за updated_atобмеженням у значенні 25 зсуву 0"


3

Цей пакет можна використовувати для отримання всіх запитів, які виконуються під час завантаження сторінки

https://github.com/barryvdh/laravel-debugbar

Цей пакет хороший, коли у вас немає помилок запиту. Якщо у вас помилка SQL, вона нічого не покаже
lewis4u


2

Якщо ви не використовуєте Laravel, але використовуєте красномовний пакет, тоді:

use \Illuminate\Database\Capsule\Manager as Capsule;
use \Illuminate\Events\Dispatcher;
use \Illuminate\Container\Container;

$capsule = new Capsule;

$capsule->addConnection([
    // connection details
]);
// Set the event dispatcher used by Eloquent models... (optional)
$capsule->setEventDispatcher(new Dispatcher(new Container));

// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();

// Setup the Eloquent ORM...(optional unless you've used setEventDispatcher())
$capsule->bootEloquent();

// Listen for Query Events for Debug
$events = new Dispatcher;
$events->listen('illuminate.query', function($query, $bindings, $time, $name)
{
    // Format binding data for sql insertion
    foreach ($bindings as $i => $binding) {
        if ($binding instanceof \DateTime) {
            $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
        } else if (is_string($binding)) {
            $bindings[$i] = "'$binding'";`enter code here`
        }
    }

    // Insert bindings into query
    $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
    $query = vsprintf($query, $bindings);

    // Debug SQL queries
    echo 'SQL: [' . $query . ']';
});

$capsule->setEventDispatcher($events);

2

ви можете використовувати годинниковий механізм

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

але працює також у firefox


2

Я створив кілька простих функцій, щоб отримати SQL та прив'язки з деяких запитів.

/**
 * getSql
 *
 * Usage:
 * getSql( DB::table("users") )
 * 
 * Get the current SQL and bindings
 * 
 * @param  mixed  $query  Relation / Eloquent Builder / Query Builder
 * @return array          Array with sql and bindings or else false
 */
function getSql($query)
{
    if( $query instanceof Illuminate\Database\Eloquent\Relations\Relation )
    {
        $query = $query->getBaseQuery();
    }

    if( $query instanceof Illuminate\Database\Eloquent\Builder )
    {
        $query = $query->getQuery();
    }

    if( $query instanceof Illuminate\Database\Query\Builder )
    {
        return [ 'query' => $query->toSql(), 'bindings' => $query->getBindings() ];
    }

    return false;
}

/**
 * logQuery
 *
 * Get the SQL from a query in a closure
 *
 * Usage:
 * logQueries(function() {
 *     return User::first()->applications;
 * });
 * 
 * @param  closure $callback              function to call some queries in
 * @return Illuminate\Support\Collection  Collection of queries
 */
function logQueries(closure $callback) 
{
    // check if query logging is enabled
    $logging = DB::logging();

    // Get number of queries
    $numberOfQueries = count(DB::getQueryLog());

    // if logging not enabled, temporarily enable it
    if( !$logging ) DB::enableQueryLog();

    $query = $callback();

    $lastQuery = getSql($query);

    // Get querylog
    $queries = new Illuminate\Support\Collection( DB::getQueryLog() );

    // calculate the number of queries done in callback
    $queryCount = $queries->count() - $numberOfQueries;

    // Get last queries
    $lastQueries = $queries->take(-$queryCount);

    // disable query logging
    if( !$logging ) DB::disableQueryLog();

    // if callback returns a builder object, return the sql and bindings of it
    if( $lastQuery )
    {
        $lastQueries->push($lastQuery);
    }

    return $lastQueries;
}

Використання:

getSql( DB::table('users') );
// returns 
// [
//     "sql" => "select * from `users`",
//     "bindings" => [],
// ]

getSql( $project->rooms() );
// returns
// [
//     "sql" => "select * from `rooms` where `rooms`.`project_id` = ? and `rooms`.`project_id` is not null",
//     "bindings" => [ 7 ],
// ]

2

Наскільки я люблю цю рамку, я ненавиджу, коли вона діє як лайно.

DB::enableQueryLog()абсолютно марно. DB::listenоднаково марно. Він показав частину запиту, коли я сказав $query->count(), але якщо я це зробити $query->get(), він нічого не може сказати.

Єдине рішення, яке, як видається, працює послідовно - навмисне вводити синтаксис чи іншу помилку в параметри ORM, як-от неіснуюче ім'я стовпця / таблиці, запускати свій код у командному рядку в режимі налагодження, і це виплюне помилку SQL з повним фрікінговим запитом нарешті. В іншому випадку, сподіваємося, помилка з’являється у файлі журналу, якщо вона запущена з веб-сервера.


Журнал запитів працює принаймні для мене. У вашій програмі мають бути інші помилки
user1415066

1

Якщо ви використовуєте тинкер і хочете увійти до складу сформованого запиту SQL, який ви можете зробити

$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.5  cli) by Justin Hileman
>>> DB::listen(function ($query) { dump($query->sql); dump($query->bindings); dump($query->time); });
=> null
>>> App\User::find(1)
"select * from `users` where `users`.`id` = ? limit 1"
array:1 [
  0 => 1
]
6.99
=> App\User {#3131
     id: 1,
     name: "admin",
     email: "admin@example.com",
     created_at: "2019-01-11 19:06:23",
     updated_at: "2019-01-11 19:06:23",
   }
>>>

1

Спробуйте це:

$results = DB::table('users')->toSql();
dd($results);

Примітка: get () було замінено toSql () для відображення необробленого запиту SQL.


1

Мій спосіб зробити це на основі подання журналу, потрібно лише змінити файл app/Providers/AppServiceProvider.php:

  1. Додайте цей код у app/Providers/AppServiceProvider.php
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    //
    DB::listen(function ($query) {
        $querySql = str_replace(['?'], ['\'%s\''], $query->sql);
        $queryRawSql = vsprintf($querySql, $query->bindings);
        Log::debug('[SQL EXEC]', [
                "raw sql"  => $queryRawSql,
                "time" => $query->time,
            ]
        );
    });
}
  1. Мій код ручки sql:
$users = DB::table('users')
    ->select(DB::raw('count(*) as user_count, username '))
    ->where('uid', '>=', 10)
    ->limit(100)
    ->groupBy('username')
    ->get()
;
dd($users);
  1. Див. Журнал storage/logs/laravel-2019-10-27.log:
[2019-10-27 17:39:17] local.DEBUG: [SQL EXEC] {"raw sql":"select count(*) as user_count, username  from `users` where `uid` >= '10' group by `username` limit 100","time":304.21} 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.