国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

webman的控制臺輸出最終的SQL語句

Ace華

先看效果,不是想要的可以直接劃走
效果圖
直接在控制臺打印解析后的sql語句,可復制到navicat執(zhí)行,而不是帶有?的prepare sql
可打印出產(chǎn)生sql語句的文件行號,方便排查

一、生成初始化文件SqlDebug

php webman make:bootstrap SqlDebug

需要先安裝命令行插件
詳細見 http://m.wtbis.cn/doc/webman/others/bootstrap.html

二、安裝dump組件

composer require symfony/var-dumper ^6.0.*

三、編輯SqlDebug

<?php

namespace app\bootstrap;

use Illuminate\Database\Events\QueryExecuted;
use support\Db;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Webman\Bootstrap;

/**
 * 在控制臺打印執(zhí)行的SQL語句
 */
class SqlDebug implements Bootstrap
{
    /**
     * 自定義輸出格式,否則輸出前面會帶有當前文件,無用信息
     * @param $var
     * @return void
     */
    public static function dumpvar($var): void
    {
        $cloner = new VarCloner();
        $dumper = new CliDumper();
        $dumper->dump($cloner->cloneVar($var));
    }

    public static function start($worker)
    {
        // Is it console environment ?
        $is_console = !$worker;
        if ($is_console) {
            // If you do not want to execute this in console, just return.
            return;
        }
        if (!config("app.debug") || config("app.debug") === 'false') return;
        $appPath = app_path();

        Db::connection()->listen(function (QueryExecuted $queryExecuted) use ($appPath) {
            if (isset($queryExecuted->sql) and $queryExecuted->sql !== "select 1") {
                $bindings = $queryExecuted->bindings;
                $sql = array_reduce(
                    $bindings,
                    function ($sql, $binding) {
                        return preg_replace('/\?/', is_numeric($binding) ? $binding : "'" . $binding . "'", $sql, 1);
                    },
                    $queryExecuted->sql
                );

                // self::dumpvar("[sql] [time:{$queryExecuted->time} ms] [{$sql}]"); // 這句話是打印所有的sql
                // 下面是只打印app目錄下產(chǎn)生的sql語句
                $traces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
                foreach ($traces as $trace) {
                    if (isset($trace['file']) && isset($trace["function"])) {
                        if (str_contains($trace['file'], $appPath)) {
                            $file = str_replace(base_path(), '', $trace['file']);
                            $str = "[file] {$file}:{$trace['line']} [function]:{$trace["function"]}";
                            self::dumpvar("[sql] [time:{$queryExecuted->time} ms] [{$sql}]");
                            self::dumpvar($str);
                        }
                    }
                }
            }
        });
    }

}

四、重啟服務,執(zhí)行model或Db類,效果如上圖

效果圖

3808 5 4
5個評論

Chance

在上個月 laravel 已經(jīng)支持輸出完整的 SQL 語句了
https://github.com/laravel/framework/releases/tag/v10.15.0

  • Ace華 2023-08-08

    可這是webman,不是laravel

lee

Thanks, I change the code to this and it works well

                $bindings = $queryExecuted->bindings;
                $sql = $queryExecuted->connection->getQueryGrammar()->substituteBindingsIntoRawSql(
                    $queryExecuted->sql,
                    $queryExecuted->connection->prepareBindings($bindings)
                );
  • Ace華 2023-08-10

    Thanks,and are you Chinese?

  • Ace華 2023-08-10

    But unfortunately, I run an error here, prompting:BadMethodCallException: Method Illuminate\Database\Query\Grammars\MySqlGrammar::substituteBindingsIntoRawSql does not exist

  • lee 2023-08-16

    I am using Laravel DB 10.15, maybe you should upgrade

    "illuminate/database": "^10.15",

  • Ace華 2023-08-19

    Thank you,now,i want to record the sql exec file line,but,the script not ,can you have the method?

  • lee 2023-08-25

    you can find caller file/function by debug_backtrace below

lee

example if you want file:line


                self::dumpvar("[sql] [time:{$queryExecuted->time} ms] [{$sql}]");
                // print file:line, filter only app folder
                $traces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
                foreach ($traces as $trace) {
                    if (stristr($trace['file'], app_path())) {
                        self::dumpvar(str_replace(app_path(), 'app', $trace['file']) . ":" . $trace['line']);
                    }
                }
  • Ace華 2023-08-26

    thank you very much,it work well

設想

太棒了~~????

  • 暫無評論
z

沒效果

        $article=new Posts();
        $article->post_author=$loginUser['userid'];
        $article->post_date=date('Y-m-d H:i:s');
        $article->post_date_gmt=date('Y-m-d H:i:s');
        $article->save();

這種的不輸出?

  • 暫無評論

Ace華

830
積分
0
獲贊數(shù)
0
粉絲數(shù)
2023-02-14 加入
??