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

Laravel模型异常:获取单模型后save()批量更新同用户eduinfo记录

问题分析与解决方案

核心问题

你遇到的批量更新问题,根源出在两个关键错误:

  1. 查询条件字段误用:你用where("id", $user->id)匹配的是eduinfo表自身的主键id,而非关联用户的外键(通常为user_id),逻辑完全错误。
  2. 模型主键配置错误(可选):如果你的eduinfo模型错误将$primaryKey设置为user_id,Laravel会把user_id当作主键,调用save()时会批量更新所有匹配该user_id的记录。

修正代码

第一步:修正查询条件

将查询中的id替换为关联用户的外键(假设为user_id,若你的外键是其他名称,对应修改即可):

public function UpdateEducationData(Request $request)
{
    $user = app('user');
    // 修正外键字段为user_id,而非eduinfo的主键id
    $education = Eduinfo::where("user_id", $user->id)
                        ->where("exam", $request->type)
                        ->firstOrFail(); // 用firstOrFail避免空模型引发的报错

    // 批量赋值简化代码(需确保模型设置了$fillable白名单)
    $education->fill([
        'board' => $request->board,
        'year' => $request->year,
        'rollno' => $request->rollno,
        'obtainmarks' => $request->obtainmarks,
        'totalmarks' => $request->totalmarks,
        'division' => $request->division,
        'grade' => $request->grade,
        'totalcgpa' => $request->totalcgpa,
        'obtailcgpa' => $request->obtailcgpa
    ]);

    $education->save();

    return redirect()->back()->with("message", "Education Information Updated Successfully");
}

第二步:检查模型主键配置

打开Eduinfo模型,确保主键设置为表自身的主键(通常是id):

class Eduinfo extends Model
{
    protected $primaryKey = 'id'; // 必须是eduinfo表的主键,而非user_id
    // 配置可批量赋值的字段白名单
    protected $fillable = ['user_id', 'exam', 'board', 'year', 'rollno', 'obtainmarks', 'totalmarks', 'division', 'grade', 'totalcgpa', 'obtailcgpa'];
}

额外优化建议

若无需先获取模型实例,可直接用update()方法更高效:

public function UpdateEducationData(Request $request)
{
    $user = app('user');
    $updatedRows = Eduinfo::where("user_id", $user->id)
                          ->where("exam", $request->type)
                          ->update([
                              'board' => $request->board,
                              'year' => $request->year,
                              'rollno' => $request->rollno,
                              'obtainmarks' => $request->obtainmarks,
                              'totalmarks' => $request->totalmarks,
                              'division' => $request->division,
                              'grade' => $request->grade,
                              'totalcgpa' => $request->totalcgpa,
                              'obtailcgpa' => $request->obtailcgpa
                          ]);

    return redirect()->back()->with(
        $updatedRows ? "message" : "error",
        $updatedRows ? "Education Information Updated Successfully" : "No matching record found to update"
    );
}

内容的提问来源于stack exchange,提问作者Malik Hamza Younas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:40:25