在 Laravel 6 中打印 SQL,复制至 MySQL 5.7 中执行,执行结果与程序执行结果不一致
1、打印程序执行的 SQL 语句,结果如下。如图1
1 2 3 4 5 6 7 8 | $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 ; |
1 | "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
1 2 3 | $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 条。符合预期。
1 2 3 4 | $assets = ThemeAsset::select( 'updated_at' , 'asset_key' ) ->where( 'theme_id' , '=' , $this ->dbViewStorage->getThemeId()) ->whereRaw( 'LOWER(asset_key) regexp ?' , [ strtolower ( addslashes ( $this ->targetToRegex( $target )))]) ->get(); |
近期评论