Laravel框架map函数内为id属性赋值返回0问题求解
问题原因说明
核心原因
这个问题是Laravel Eloquent模型的默认主键配置导致的,并非对小写id属性有特殊限制:
- Laravel所有Eloquent模型默认约定主键字段为小写
id,默认的主键类型$keyType为int,且默认开启自增$incrementing = true。 - 当你给模型的
id属性赋值字符串时,Eloquent会自动将值强制转换为配置的主键类型(即整型),非数字开头的字符串转为整型后结果就是0,和你输出的结果完全吻合。 - 改为大写
ID后,Eloquent不会将其识别为默认主键,不会触发强制类型转换,所以赋值的字符串可以正常保留。
解决方案
如果需要使用小写id作为自定义属性,可根据场景选择以下方案:
方案1:调整Loan模型的主键配置(适合该模型本身主键不符合默认约定的场景)
在App\Models\Loan类中添加以下配置:
// 如果你的表主键不是id,修改为实际主键字段 protected $primaryKey = '你的实际主键字段名'; // 如果主键是字符串类型,添加以下配置 public $keyType = 'string'; public $incrementing = false;
方案2:操作集合时转为普通数组/对象(适合临时自定义字段、不想修改模型全局配置的场景)
查询后先转为数组再操作,避免Eloquent的类型转换影响:
$drillDownChart = Loan::select('loan_type AS name') ->groupBy('loan_type') ->where('transaction_year', $transyear) ->where('invalid', false) ->get() ->toArray(); // 转为普通数组 $drillDownChart = collect($drillDownChart)->map(function($val) use ($loanChartArr) { $val['id'] = $val['name']; $val['data'] = $loanChartArr; return $val; });
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

