为何Laravel生产环境返回的数字和布尔值会被转为字符串类型?
问题产生原因
- 核心为数据库PDO配置差异:生产环境PDO连接开启了
ATTR_STRINGIFY_FETCHES参数,该参数启用后会强制将数据库查询返回的所有数值、布尔类型结果自动转为字符串 - MySQL驱动版本差异:本地环境使用
mysqlnd作为PHP MySQL驱动,生产环境使用旧版libmysqlclient驱动,后者默认将所有数据库返回的数值类型转为字符串,不受PDO参数控制 - Laravel模型未配置类型转换:接口返回数据直接来自模型查询结果,未配置
$casts属性做强制类型转换,会直接继承PDO返回的字段类型
解决方案
- 修改Laravel数据库配置:打开
config/database.php,找到mysql连接的options配置项,添加如下参数强制关闭字符串化逻辑:
'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), // 新增以下两行配置 PDO::ATTR_STRINGIFY_FETCHES => false, PDO::ATTR_EMULATE_PREPARES => false, ]) : [],
如果原有配置已经存在options数组,直接添加两行PDO参数即可,不要覆盖已有配置
- 替换生产环境MySQL驱动:执行
php -i | grep mysqlnd检查当前驱动,无输出的话卸载原有php-mysql包,安装php-mysqlnd包即可,CentOS环境执行命令:yum remove php-mysql && yum install php-mysqlnd - 配置模型强制类型转换:在对应数据模型中添加
$casts属性,明确指定字段的返回类型,不受数据库环境配置影响:
protected $casts = [ 'age' => 'integer', 'is_admin' => 'boolean', ];
该方案兼容性最强,优先推荐使用
内容的提问来源于stack exchange,提问作者d3ridi
相关产品推荐
相关产品推荐

