Ответ 1
Если вы используете Laravel 4, используйте это:
$queries = DB::getQueryLog();
$last_query = end($queries);
Есть ли что-то подобное в Laravel, которое позволяет вам видеть, как выполняется фактический SQL? В Rails, например, вы можете увидеть SQL в консоли. В Django у вас есть панель инструментов.
Есть ли что-то подобное в Laravel 4?
Чтобы уточнить: Мой вопрос заключается в том, как это сделать без кода. Есть ли что-то, что встроено в Laravel, которое не требует от меня писать код в приложении?
ОБНОВЛЕНИЕ. Желательно также видеть запросы CLI (например, php artisan migrate
)
Если вы используете Laravel 4, используйте это:
$queries = DB::getQueryLog();
$last_query = end($queries);
Я делаю это в Laravel 4.
Просто установите его один раз в app/start/global.php
или в любом месте, но убедитесь, что он загружен, и затем он начнет регистрировать все ваши SQL-запросы.
Event::listen("illuminate.query", function($query, $bindings, $time, $name){
\Log::sql($query."\n");
\Log::sql(json_encode($bindings)."\n");
});
Вот быстрый фрагмент Javascript, который вы можете наложить на свой шаблон главной страницы. Пока он включен, все запросы будут выводиться на ваш браузер Javascript Console. Он печатает их в легко читаемом списке, что упрощает просмотр вашего сайта и просмотр того, какие запросы выполняются на каждой странице.
Когда вы закончите отладку, просто удалите ее из своего шаблона.
<script type="text/javascript">
var queries = {{ json_encode(DB::getQueryLog()) }};
console.log('/****************************** Database Queries ******************************/');
console.log(' ');
$.each(queries, function(id, query) {
console.log(' ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
});
console.log(' ');
console.log('/****************************** End Queries ***********************************/');
</script>
Для этого есть пакет Composer: https://packagist.org/packages/loic-sharma/profiler
Он даст вам панель инструментов внизу с SQL-запросами, сообщениями журналов и т.д. Убедитесь, что вы установили debug
в true в своей конфигурации.
Здесь еще одна хорошая опция отладки для Laravel 4:
Я придумал очень простой способ (если вы используете php artisan serve
и PHP 5.4) - добавьте это в app/start/local.php
:
DB::listen(function($sql, $bindings, $time)
{
file_put_contents('php://stderr', "[SQL] {$sql} in {$time} s\n" .
" bindinds: ".json_encode($bindings)."\n");
});
но надеясь найти более официальное решение.
Это приведет к выводу SQL-запросов следующим образом:
[SQL] select 1 in 0.06s
Этот код непосредственно взят из другого источника, но я хотел упростить его, так как после него он работал на PHPStorm, используя мое окно терминала. Я смог просмотреть полный журнал, но после login была Sentry.
1.add
'log'=>true
внутри вашего config/database.php
и ниже места имени базы данных ur ex.mysql
то добавьте ниже код в routes.php
, прежде всего, без какой-либо конфигурации маршрута, так как u может сделать это в соответствии с конфигурацией маршрута выдачи, но, только посмотрите, когда вызывается этот маршрут.
чтобы увидеть этот вывод /goto / app/storage/log/somelogfile.log
if (Config::get('database.log', false))
{
Event::listen('illuminate.query', function($query, $bindings, $time, $name)
{
$data = compact('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'";
}
}
// Insert bindings into query
$query = str_replace(array('%', '?'), array('%%', '%s'), $query);
$query = vsprintf($query, $bindings);
Log::info($query, $data);
});
}
Не забудьте сделать точку останова.... или ping me:)
В экземпляре QueryBuilder существует метод toSql().
echo DB::table('employees')->toSql()
вернется:
select * from `employees`
Это самый простой способ отображения запросов.