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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:09:30