在 Laravel 6 中打印 SQL,复制至 MySQL 5.7 中执行,执行结果与程序执行结果不一致
1、打印程序执行的 SQL 语句,结果如下。如图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
3、将打印 SQL,复制至 MySQL 5.7 中执行。其数量为 81 条。如图3
4、决定将 whereRaw 中的 ? 取消,调整为原生 SQL。打印程序执行的 SQL 语句结果,其数量为 81 条。如图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();
近期评论