You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中PDO查询int类型转为字符串问题求助

解决Laravel在cPanel服务器上API返回int字段为字符串的问题

可能的原因及对应解决步骤

1. 配置缓存未清空

cPanel服务器通常会启用配置缓存,修改config/database.php后如果没清缓存,新配置不会生效。执行以下命令:

php artisan config:clear
php artisan cache:clear

如果服务器开启了OPcache,需要在cPanel的PHP设置里清空OPcache,或者重启Apache服务,确保配置文件被重新加载。

2. 数据库PDO配置错误或不完整

确保config/database.php中的mysql连接配置正确设置了PDO属性,必须包含ATTR_EMULATE_PREPARES => false(仅设置ATTR_STRINGIFY_FETCHES可能在部分环境下不生效):

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    // ... 其他基础配置
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::ATTR_STRINGIFY_FETCHES => false,
        PDO::ATTR_EMULATE_PREPARES => false, // 关键:禁用预编译模拟,确保类型映射正确
    ]) : [],
],

3. 服务器PHP驱动问题

检查服务器的PHP是否使用mysqlnd驱动(旧的libmysqlclient驱动对PDO类型支持不佳):

  • 在cPanel的PHP版本管理中,确保mysqlnd扩展已启用
  • 通过phpinfo()查看PDO MySQL的驱动类型,确认显示为mysqlnd

4. 验证PDO配置是否实际生效

在控制器中临时添加代码,检查当前连接的PDO属性值:

use Illuminate\Support\Facades\DB;

// 在控制器方法中添加
dd(DB::connection()->getPdo()->getAttribute(PDO::ATTR_STRINGIFY_FETCHES));

如果输出为true,说明配置未加载,重新检查缓存和配置文件路径;如果输出为false,则问题出在序列化环节。

5. 序列化环节的类型丢失

如果PDO配置已生效但API返回仍为字符串,检查序列化逻辑:

  • 模型字段映射:如果用Eloquent,可以在模型中通过$casts指定字段类型(适合局部字段,避免全局修改):
    protected $casts = [
        'user_id' => 'integer',
        'post_count' => 'integer',
        // 其他int类型字段
    ];
    
  • 全局JSON序列化设置:在config/app.php中添加JSON_NUMERIC_CHECK选项,强制将数字字符串转为数值类型(注意:会影响所有JSON响应,需评估风险):
    'json_options' => JSON_NUMERIC_CHECK,
    
  • 第三方序列化包:如果项目使用了如spatie/laravel-fractal之类的序列化工具,检查其配置是否强制转换了字段类型。

内容的提问来源于stack exchange,提问作者Kev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:01:13