Laravel 的 DB 查询是如何实现字段类型自动转的?

在Laravel环境中,程序在运行环境A中Integer字段正常返回,但在运行环境B中变为String类型,引发JavaScript问题。经过排查,确定不是数据库字段类型问题,而是Laravel的PDO设置差异。Laravel在查询时会自动将字段类型转换为对应的int或float,而原生PDO返回的均为string。解决方案是调整PDO设置,使运行环境B与A保持一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近使用 Laravel 写了一段程序,首先程序在 运行环境A 部署,没有发现任何问题返回数据该是 Integer 的还是 Integer。但是最近将程序原封不动的部署在 运行环境B 情况却发生了变化。所有的 Integer 型都变成了 String 型。导致部分 Javascript 部分的 switch 或者 if 出现了不该出现的问题。

虽然通过重构代码可以解决问题,但是由于涉及的代码片段范围比较广泛,不便于修改代码片段解决。不知道有没有什么办法让 运行环境B 中运行的程序也像 运行环境A 中的程序返回 Integer 型呢?

两个运行环境部署方法一致,且数据库字段类型已经检查确认没有问题。查阅了网上部分说明貌似 Laravel 会自动转换类型?感谢大家的指点。

运行环境 A 返回样例

'''
{
"data1": 1,
"data2": 0,
"data3": "example"
}
'''

运行环境 B 返回样例

'''
{
"data1": "1",
"data2": "0",
"data3": "example"
}
'''

解决办法

原来是PDO 设置问题, laravel中的 Illuminate\Database\Connectors\Connector 有:

protected $options = array(
        PDO::ATTR_CASE => PDO::CASE_NATURAL,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
        PDO::ATTR_STRINGIFY_FETCHES => false,
        PDO::ATTR_EMULATE_PREPARES => false,
);

关键的一项: PDO::ATTR_STRINGIFY_FETCHES => false

举个例子,有一条sql如:
select * from factory limit 1

用php PDO查出结果集如下:

file

注意绿色框里的值均为 string 型;

但是用 laravel的方式,DB::connection()->select("select * from factory limit 1");
结果集如下:

file

同样结果,不同的是字段值的类型不同,原生的PDO 均是string ,但laravel 会转成相应的 int/float 型。。。

laravel 是如何做到的?debug 好久都没找出原因,求指教~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值