Laravel 11中如何关闭MySQL的ONLY_FULL_GROUP_BY模式(不关闭严格模式)
在Laravel 11中保留严格模式但移除ONLY_FULL_GROUP_BY的配置方法
当config/database.php中strict = true时,MySQL会启用包含ONLY_FULL_GROUP_BY的严格SQL模式,这会限制简单GROUP BY查询的执行。如果不想关闭整体严格模式,仅移除ONLY_FULL_GROUP_BY选项,可以通过修改数据库配置中的PDO初始化命令实现:
配置修改方案
打开config/database.php,找到mysql配置数组,在options中添加PDO::MYSQL_ATTR_INIT_COMMAND配置项,具体代码如下:
'mysql' => [ 'driver' => 'mysql', 'url' => env('DB_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'laravel'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'sslmode' => env('DB_SSLMODE', 'required'), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => env('DB_CHARSET', 'utf8mb4'), 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, // 保持严格模式开启 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), // 初始化会话时移除ONLY_FULL_GROUP_BY PDO::MYSQL_ATTR_INIT_COMMAND => "SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''))", ]) : [], ],
配置说明
- 保留
'strict' => true:维持Laravel严格模式的其他约束,仅针对ONLY_FULL_GROUP_BY做单独移除 PDO::MYSQL_ATTR_INIT_COMMAND:每次数据库连接建立时,执行该SQL语句动态修改当前会话的sql_mode,将其中的ONLY_FULL_GROUP_BY剔除,不影响全局数据库配置array_filter:过滤空值配置项,确保数组仅包含有效参数
内容的提问来源于stack exchange,提问作者Čamo
相关产品推荐
相关产品推荐

