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

更新Papers与Authors表时遇Unknown variable [Fname]错误的解决方法

问题描述

更新论文时触发「Unknown variable [Fname]」错误,Papers表更新正常,但Authors表无法更新。控制器update函数代码如下:

public function update(Request $request, $PaperID)
{
    $request->validate([
        'PaperTitle' => 'required',
        'PaperType' => 'required',
        'file' => [
            'required',
            File::types('pdf')
                ->max(12 * 1024),
        ],
    ]);

    $paper=Papers::find($PaperID);
    

    $file=$request->file;

    $filename=time().'.'.$file->getClientOriginalExtension();
            $request->file->move('assets', $filename);
            $paper->file=$filename;

        $paper->PaperTitle=$request->PaperTitle;
        $paper->PaperType=$request->PaperType;
        $paper->College=$request->College;
        $paper->DateCompleted=$request->DateCompleted;
        $paper->ContentAdviser=$request->ContentAdviser;
        
        $paper->update();

        $input = $request->all();

        if(count($input['Fname']) > 0){
            for($i = 0 ; $i < count($input['Fname']) ; $i++){
                

                $author->Fname = $input['Fname'][$i];
                $author->Lname = $input['Lname'][$i];
                $author->update();
            }
        }

        return redirect()->back()->with('success','File has been updated.');

}
核心问题
  1. $author变量未实例化:循环中直接调用$author->Fname,但从未创建或查询获取Author模型实例,PHP无法识别该变量,导致报错。
  2. 未处理Paper与Author的关联关系:代码没有明确指定要更新的作者属于当前论文,也没有验证作者字段的合法性。
  3. 文件上传逻辑强制要求更新:每次更新都必须上传文件,业务灵活性不足。
修复方案

假设Paper与Author是一对多关联(一个论文对应多个作者),Paper模型已定义authors()关联方法:

// app/Models/Paper.php
public function authors()
{
    return $this->hasMany(Author::class);
}

1. 补全验证规则

添加作者字段的验证,确保前端提交的数据合法:

$request->validate([
    'PaperTitle' => 'required',
    'PaperType' => 'required',
    'file' => [
        'nullable', // 改为可选,允许不更新文件
        File::types('pdf')->max(12 * 1024),
    ],
    // 验证作者数组字段
    'Fname' => 'required|array',
    'Fname.*' => 'required|string|max:255',
    'Lname' => 'required|array',
    'Lname.*' => 'required|string|max:255',
]);

2. 修复文件上传逻辑

允许用户选择是否更新文件,避免强制上传:

$paper = Papers::findOrFail($PaperID);

// 仅当有新文件上传时才更新
if ($request->hasFile('file')) {
    $file = $request->file('file');
    $filename = time() . '.' . $file->getClientOriginalExtension();
    $file->move('assets', $filename);
    $paper->file = $filename;
}

// 更新论文基础信息
$paper->update([
    'PaperTitle' => $request->PaperTitle,
    'PaperType' => $request->PaperType,
    'College' => $request->College,
    'DateCompleted' => $request->DateCompleted,
    'ContentAdviser' => $request->ContentAdviser,
]);

3. 处理作者更新逻辑

根据业务需求选择以下两种方案之一:

方案A:覆盖更新所有作者(删除旧作者,新增新作者)

适合不需要保留历史作者记录的场景:

// 删除当前论文的所有旧作者
$paper->authors()->delete();

// 批量新增作者
foreach ($request->Fname as $index => $fname) {
    $paper->authors()->create([
        'Fname' => $fname,
        'Lname' => $request->Lname[$index],
        // 若Author表有其他字段,可在此添加
    ]);
}

方案B:更新现有作者+新增作者(保留历史作者)

适合需要修改现有作者信息并允许新增作者的场景,要求前端提交author_id[]字段(对应现有作者ID,新增作者可传空):

foreach ($request->Fname as $index => $fname) {
    $authorId = $request->author_id[$index] ?? null;
    
    if ($authorId) {
        // 更新现有作者
        $author = Author::findOrFail($authorId);
        $author->update([
            'Fname' => $fname,
            'Lname' => $request->Lname[$index],
        ]);
    } else {
        // 新增作者
        $paper->authors()->create([
            'Fname' => $fname,
            'Lname' => $request->Lname[$index],
        ]);
    }
}

4. 完整修复后的update函数

public function update(Request $request, $PaperID)
{
    $request->validate([
        'PaperTitle' => 'required',
        'PaperType' => 'required',
        'file' => [
            'nullable',
            File::types('pdf')->max(12 * 1024),
        ],
        'Fname' => 'required|array',
        'Fname.*' => 'required|string|max:255',
        'Lname' => 'required|array',
        'Lname.*' => 'required|string|max:255',
    ]);

    $paper = Papers::findOrFail($PaperID);

    // 更新文件(可选)
    if ($request->hasFile('file')) {
        $file = $request->file('file');
        $filename = time() . '.' . $file->getClientOriginalExtension();
        $file->move('assets', $filename);
        $paper->file = $filename;
    }

    // 更新论文信息
    $paper->update([
        'PaperTitle' => $request->PaperTitle,
        'PaperType' => $request->PaperType,
        'College' => $request->College,
        'DateCompleted' => $request->DateCompleted,
        'ContentAdviser' => $request->ContentAdviser,
    ]);

    // 方案A:覆盖更新作者
    $paper->authors()->delete();
    foreach ($request->Fname as $index => $fname) {
        $paper->authors()->create([
            'Fname' => $fname,
            'Lname' => $request->Lname[$index],
        ]);
    }

    // 若使用方案B,替换上面的代码为方案B的逻辑即可

    return redirect()->back()->with('success', '论文及作者信息已更新。');
}

内容的提问来源于stack exchange,提问作者Dynow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:40:27