如何强制Laravel返回符合正确数据类型的JSON响应
解决方案
- 首选方案:在对应模型中配置
$casts属性
这是Laravel官方推荐的字段类型转换方案,作用于模型所有查询场景,配置一次全局生效。在你的MyModel类中添加以下代码:
class MyModel extends Model { // 已有模型代码 protected $casts = [ 'lang_id' => 'integer', // 强制转为整数类型 'open_on_smalldevice' => 'boolean', // 强制转为布尔类型,自动将1转true、0转false ]; }
默认Laravel只会对主键id自动配置整数类型转换,其余自定义整数字段都需要手动指定转换规则。
- 全局修复PDO字符串化问题
如果项目中大量模型都出现整数字段返回字符串的情况,大概率是PHP PDO配置开启了结果字符串化,你可以在config/database.php的MySQL连接配置项中修改PDO参数:
'mysql' => [ // 已有数据库配置项 'options' => [ PDO::ATTR_STRINGIFY_FETCHES => false, // 关闭查询结果自动字符串化 PDO::ATTR_EMULATE_PREPARES => false, // 关闭模拟预处理,避免底层类型转换异常 ], ]
修改配置后记得清空配置缓存或重启服务生效。
- 临时处理方案(不推荐)
如果只需要在当前接口临时调整类型,可以在查询后通过集合遍历修改字段类型:
public function list(Request $request) { return MyModel::whereIsPublic(true) ->get() ->map(function ($item) { $item->lang_id = (int) $item->lang_id; $item->open_on_smalldevice = (bool) $item->open_on_smalldevice; return $item; }); }
这个方法只对当前接口生效,复用性差,仅适合临时调试使用。
内容的提问来源于stack exchange,提问作者netdjw
相关产品推荐
相关产品推荐

