Laravel自定义简化数据保存函数的属性键错误修正求助
问题:Laravel自定义save函数导致模型attributes数组异常
常规Laravel数据保存代码
在Laravel中,通常用以下代码将数据存入数据库:
$address = new Address(); $address->user_id = $user->id; $address->title = $request->get('title'); $address->detail = $request->get('detail'); $address->phone = $request->get('phone'); $address->address = $request->get('address'); $address->save();
自定义save函数及调用示例
为简化操作,编写了自定义save函数,调用示例及函数代码如下:
save( class: Address::class, fields: [ 'title', 'detail', 'phone', 'address', 'user_id' => 1, ] ); function save($class, $fields): void { $class = new $class; foreach ($fields as $key => $field) { if ($key == null) { $class->$field = get($field); } else { $class->$key = $field; } } $class->save(); } function get(string $key) { return request()->get($key); }
异常现象
使用该函数后,模型的attributes数组出现异常:
#attributes: array:5 [ "title" => "aaaaa" 1 => "detail" 2 => "phone" 3 => "address" "user_id" => 1 ]
预期结果
正确的attributes数组应为:
#attributes: array:5 [ "title" => "test" "detail" => "test detail" "phone" => "test phone" "address" => "test address" "user_id" => 1 ]
问题原因及修正方案
问题原因
循环中的判断逻辑错误:索引数组的键是数字(如0、1、2)而非null,原判断$key == null仅对第一个索引元素(key=0)生效,后续索引元素的key为1、2等,会进入else分支,导致把数字key直接赋值给模型属性,出现异常。
修正后的代码
function save($class, $fields): void { $model = new $class; foreach ($fields as $key => $value) { // 区分索引数组元素(仅字段名)和关联数组元素(字段名=>值) if (is_int($key)) { // 索引元素:$value是字段名,从Request中取值 $model->$value = request()->get($value); } else { // 关联元素:直接赋值字段名和对应值 $model->$key = $value; } } $model->save(); }
也可以用更简洁的写法:
function save($class, $fields): void { $model = new $class; foreach ($fields as $key => $value) { $field = is_string($key) ? $key : $value; $model->$field = is_string($key) ? $value : request()->get($field); } $model->save(); }
修正后,函数会正确处理两种字段定义方式,生成符合预期的attributes数组。
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

