Как получить построитель запросов для вывода его необработанного SQL-запроса в виде строки?


545

Учитывая следующий код:

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

Я хочу получить необработанную строку запроса SQL, которую сгенерирует построитель запросов базы данных выше. В этом примере это было бы SELECT * FROM users.

Как мне это сделать?


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

Я использую пакет для Laravel - Telescope, он регистрирует все запросы и делает еще много вещей.
— Винса

Ответы:


662

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

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
хм, я не уверен, но вы можете достичь того, чего хотите, с помощью пакета композитора 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() вернется:

выберите * из `users`

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


6
Я думаю, что это самый простой способ при использовании Eloquent вне Laravel
— Gab

8
@Stormsson Это невозможно, потому что PHP никогда не заменяет запрос связанными значениями. Чтобы получить запросы в полном объеме, вам нужно зарегистрировать их в MySQL. Больше информации здесь: stackoverflow.com/questions/1786322/…
— Матфея

40
@Stormsson вы можете использовать getBindingsметод. Это вернет привязки для того, чтобы они были связаны с оператором SQL.
— danronmoon

2
Очень полезно для отладки сложных запросов, которые Eloquent отказывается выполнять, так как они не отображаются в журнале запросов.
— BobChao87

34
Получить запрос с привязками$query = \DB::table('users')->where('id', 10); $sql = str_replace_array('?', $query->getBindings(), $query->toSql()); dd($sql);
— Эннио Соуза

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
Это, безусловно, лучший ответ, простой и прямой к сути. Спасибо :)
— Собакус

18
Как однострочник:$query = vsprintf(str_replace(array('?'), array('\'%s\''), $builder->toSql()), $builder->getBindings());
— kramer65

Это должно быть включено во фреймворк как нативная функция .. спасибо
— Томаш Млезива

Обратите внимание, что это не будет работать, если ваш запрос уже имеет знаки процента, например, для LIKEзапроса или при форматировании дат. Вам нужно сначала убежать с двойными знаками процента.
— Неизвестный Дев

Есть ли проблемы безопасности при этом? Обеззаражены ли крепления $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 :: listen () в Laravel 4
— Мигель Стивенс

2
Спасибо, это здорово. Приятно отметить, что dd - это функция, которая создает Dump для заданной переменной и use Illuminate\Support\Facades\Event;
— завершает

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;
}

РЕДАКТИРОВАТЬ

обновленные версии, по-видимому, по умолчанию отключают ведение журнала запросов (приведенное выше возвращает пустой массив). Чтобы снова включить, при инициализации Capsule Manager захватите экземпляр соединения и вызовите enableQueryLogметод

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

ИЗМЕНИТЬ СНОВА

Принимая во внимание фактический вопрос, вы могли бы фактически сделать следующее, чтобы преобразовать текущий одиночный запрос вместо всех предыдущих запросов:

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

я получаю этот тип возврата из запроса "name = [{" name ":" rifat "}]" что мне нужно сделать, чтобы получить только "name = rifat"?
— бестелесный

Я бы распечатал ваши привязки, похоже, вы передаете массив вместо строки
— Люк Сноуден

Это полезное начало, но, кажется, не следует добавлять одинарные кавычки вокруг параметризованных значений, например, когда я передаю строку вроде 'US/Eastern'.
— Райан

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

1
@LukeSnowden Ваш ответ гениален! Я наконец нашел время, чтобы опробовать вашу новую версию (которую я отредактировал выше, чтобы включить вашу is_numericидею), и она работает! Мне это нравится. Спасибо.
— Райан

36

В eloquent есть метод для получения строки запроса.

toSql ()

в нашем случае

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

возвращение

select * from users

это точное решение, которое возвращает строку запроса SQL .. Надеюсь, это полезно ...


11
как насчет привязки запроса? Например, когда вы делаете ->where('foo', '=', 'bar')бар не будет показывать в sql
— Toskan

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

Это гораздо точнее, контролируется и отвечает потребностям вопроса.
— Бенджаминхалл

Спасибо за ваш комментарий.
— Кулдип Мишра

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;
}

В качестве входного параметра вы можете использовать любой из этих

Осветить \ Database \ Eloquent \ Builder

Осветить \ Database \ Eloquent \ Отношения \ HasMany

Осветить \ Database \ Query \ 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, где user_id =: id', ['id' => $ user]); DB :: enableQueryLog (); но не получил никакого вывода dd (DB :: getQueryLog ());
— Anoop PS

нужно ли нам включать какую-либо библиотеку
— Anoop PS

1
Шаг 1: DB :: enableQueryLog (); шаг 2: $ result = DB :: select ('select * from sqrt_user_modules, где user_id =: id', ['id' => $ user]); шаг 3: дд (DB :: getQueryLog ());
— Рави Грива

13

Это лучшее решение, которое я могу предложить любому для отладки красноречивого последнего или последнего запроса, хотя это также обсуждалось:

// 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 Issue, чтобы узнать больше об этом.

Надеюсь, поможет :)


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. Добавьте псевдоним для Eloquent Builder. ( Laravel 5.4+ )

    \Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
        return ($this->getQuery()->toRawSql());
    });
  3. Затем отлаживайте как обычно. ( Laravel 5.4+ )

    Например, Query Builder

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

    Например, Eloquent Builder

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

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

Например, Eloquent Builder ( Laravel 5.1 - 5.3 )

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

Ой, я опоздал. Просто хочу отправить ответ с помощью макроса. Это самый хороший ответ. Должен быть принят ответ: D
— nmfzone

Вы можете абстрагировать последнее в область видимости на базовой модели
— Ожье


7

От Laravel 5.2и далее. Вы можете использовать, DB::listenчтобы получить выполненные запросы.

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

Или, если вы хотите отладить один Builderэкземпляр, вы можете использовать toSqlметод.

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

1
Функция прослушивания полезна, объявляйте ее перед выполнением запроса и выводите sql & bindings в методе. Несовершенный, но работает быстрее / проще, чем другие ответы.
— Андрей

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из созданного_атла и протестируйте этот SQL, как вам нравится, в любом редакторе SQL, таком как редактор SQL phpMyAdmin!

Примечание:

Решение было протестировано с Laravel 5.4 .


2
Это лучший ответ на сегодняшний день! Так просто! :)
— Пикард

Это не будет отображаться запрос с креплениями, т.е. привязок покажет как:id
— Shantha Кумара

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

6

Чтобы увидеть выполненный запрос Laravel, используйте журнал запросов laravel

DB::enableQueryLog();

$queries = DB::getQueryLog();

6

Начиная с Laravel 5.8.15, у построителя запросов теперь есть dd и dumpметоды, так что вы можете делать

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

Спасибо. ДД работает очень хорошо. DB :: table ('data') -> где ('a', 1) -> dd ();
— Waqas

Лучше, чем другие ответы в списке.
— Хамис А. Хан

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-запрос, выполняемый вашим приложением, вы можете использовать метод listen. Этот метод полезен для регистрации запросов или отладки. Вы можете зарегистрировать прослушиватель запросов у поставщика услуг:

<?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пределу desc 25 смещение 0"


3

Вы можете использовать этот пакет для получения всех запросов, которые выполняются при загрузке вашей страницы

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

Этот пакет хорош, когда у вас нет ошибок запроса. Если у вас ошибка SQL, она ничего не показывает
— lewis4u


2

Если вы не используете Laravel, а используете пакет Eloquent, тогда:

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

Если вы используете tinker и хотите записать сформированный 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.