在 Laravel 6 中打印 SQL,复制至 MySQL 5.7 中执行,执行结果与程序执行结果不一致

1、打印程序执行的 SQL 语句,结果如下。如图1

图1

       $builder = ThemeAsset::select('updated_at', 'asset_key')
           ->where('theme_id', '=', $this->dbViewStorage->getThemeId())
           ->whereRaw('LOWER(asset_key) regexp ?', [strtolower($this->targetToRegex($target))]);

       $query = str_replace(array('?'), array('\'%s\''), $builder->toSql());
       $query = vsprintf($query, $builder->getBindings());
       dump($query);
       exit;
"select `updated_at`, `asset_key` from `theme_asset` where `theme_id` = 'theme' and LOWER(asset_key) regexp '^(assets|apps\.+\.+\assets)'"

2、打印程序执行的 SQL 语句结果,其数量为 79 条。数组元素从 0 开始。如图2

图2

3、将打印 SQL,复制至 MySQL 5.7 中执行。其数量为 81 条。如图3

图3

4、决定将 whereRaw 中的 ? 取消,调整为原生 SQL。打印程序执行的 SQL 语句结果,其数量为 81 条。如图4

图4

$builder = ThemeAsset::select('updated_at', 'asset_key')
           ->where('theme_id', '=', $this->dbViewStorage->getThemeId())
           ->whereRaw('LOWER(asset_key) regexp \'^(assets|apps\.+\.+\assets)\'')

5、保留 whereRaw 中的 ?,需要使用 addslashes 转义 \。打印程序执行的 SQL 语句结果,其数量为 81 条。符合预期。

$assets = ThemeAsset::select('updated_at', 'asset_key')
            ->where('theme_id', '=', $this->dbViewStorage->getThemeId())
            ->whereRaw('LOWER(asset_key) regexp ?', [strtolower(addslashes($this->targetToRegex($target)))])
            ->get();
永夜