gpt4 book ai didi

mysql - 拉维尔 5 : How to dump SQL query?

转载 作者:可可西里 更新时间:2023-11-01 07:30:02 25 4
gpt4 key购买 nike

Laravel 5 的内置解决方案

在 Laravel 5+ 中,我们可以使用 \DB::getQueryLog() 来检索所有已执行的查询。因为,查询日志记录是一项广泛的操作并会导致性能问题,所以它在 L5 中默认被禁用,并且只推荐用于开发环境。我们可以使用 \DB::enableQueryLog() 方法启用查询日志记录,如 [Laravel 文档][1] 中所述。

内置解决方案中的问题

DB::getQueryLog() 函数很棒,但有时我们希望以平面 SQL 格式进行转储会更好,这样我们就可以在我们最喜欢的 MySQL 应用程序中复制/粘贴它像 phpMyAdminSqlyog 来执行它并调试或优化它。

所以,我需要一个辅助函数来帮助我生成包含以下附加信息的转储:

  • 转储调用了哪个文件和行号。
  • 从查询中删除反引号。
  • 平面查询,因此不需要手动更新绑定(bind)参数,我可以在 phpMyAdmin 等中复制/粘贴 SQL 来调试/优化查询。

最佳答案

定制解决方案

第 1 步:启用查询日志记录

在路由文件顶部复制/粘贴以下代码块:

# File: app/Http/routes.php
if (\App::environment( 'local' )) {
\DB::enableQueryLog();
}

第二步:添加辅助函数

if (!function_exists( 'dump_query' )) {
function dump_query( $last_query_only=true, $remove_back_ticks=true ) {

// location and line
$caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 1 );
$info = count( $caller ) ? sprintf( "%s (%d)", $caller[0]['file'], $caller[0]['line'] ) : "*** Unable to parse location info. ***";

// log of executed queries
$logs = DB::getQueryLog();
if ( empty($logs) || !is_array($logs) ) {
$logs = "No SQL query found. *** Make sure you have enabled DB::enableQueryLog() ***";
} else {
$logs = $last_query_only ? array_pop($logs) : $logs;
}

// flatten bindings
if (isset( $logs['query'] ) ) {
$logs['query'] = $remove_back_ticks ? preg_replace( "/`/", "", $logs['query'] ) : $logs['query'];

// updating bindings
$bindings = $logs['bindings'];
if ( !empty($bindings) ) {
$logs['query'] = preg_replace_callback('/\?/', function ( $match ) use (&$bindings) {
return "'". array_shift($bindings) . "'";
}, $logs['query']);
}
}
else foreach($logs as &$log) {
$log['query'] = $remove_back_ticks ? preg_replace( "/`/", "", $log['query'] ) : $log['query'];

// updating bindings
$bindings = $log['bindings'];
if (!empty( $bindings )) {
$log['query'] = preg_replace_callback(
'/\?/', function ( $match ) use ( &$bindings ) {
return "'" . array_shift( $bindings ) . "'";
}, $log['query']
);
}
}

// output
$output = ["*FILE*" => $info,
'*SQL*' => $logs
];

dump( $output );
}

如何使用?

获取上次执行的查询的转储,在查询执行后立即使用:

dump_query();

转储所有已执行的查询使用:

dump_query( false );

关于mysql - 拉维尔 5 : How to dump SQL query?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41312205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com