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

Laravel中两张表字段更新失败:save()调用后数据库未生效

问题原因分析及解决方案

核心问题:$visitPatient 并非 Eloquent 模型实例

你通过 FP_Patient::join(...) 查询得到的 $visitPatient 不是真正的 FP_Patient 模型对象,而是查询构建器返回的普通 stdClass 对象/集合。这类对象不具备 Eloquent 模型的 save() 方法特性——修改属性后调用 save() 不会触发数据库更新操作,这就是返回结果能看到属性变化,但数据库无更新的根本原因。

其他潜在问题

  • 未定义变量导致逻辑未执行:代码中 $patient_file_id、$contraceptive_method_id、$currentMonth、$currentYear 未在方法内定义或从请求中获取,可能导致对应更新逻辑块(如 if(isset($contraceptive_method_id)))完全不执行,自然不会修改字段。
  • $visitRegister 可能不存在:如果 where('visit_id', $visit_id) 未匹配到记录,$visitRegister 会是 null,调用 save() 会抛出错误(若未开启错误捕获),建议先确认该查询能获取有效记录。
  • 模型字段权限限制:虽然你是直接赋值属性而非批量赋值,但如果模型的 $guarded 包含要更新的字段,或 $fillable 未包含这些字段,也可能导致更新失败(直接赋值场景下概率较低,但可排查)。

修复方案

1. 修正 $visitPatient 的查询方式

不要用 join 查询模型,改用 Eloquent 关联或分步查询,确保返回真正的模型实例:

// 方式一:利用模型关联(前提是 FP_Register 和 FP_Patient 已定义关联)
$visitRegister = FP_Register::where('visit_id', $visit_id)->first();
if ($visitRegister) {
    $visitPatient = $visitRegister->patient; // 假设 FP_Register 定义了 patient() 关联到 FP_Patient
}

// 方式二:分步查询
$register = FP_Register::where('visit_id', $visit_id)->first();
if ($register) {
    $visitPatient = FP_Patient::where('id', $register->patient_id)
        ->where('patient_file_id', $patient_file_id)
        ->first();
}

2. 补全未定义变量

确保所有用到的变量有合法值,比如从请求中获取:

$patient_file_id = $request->input('patient_file_id');
$contraceptive_method_id = $request->input('contraceptive_method_id');
$currentMonth = date('m');
$currentYear = date('Y');

3. 增加实例存在性检查

调用 save() 前先确认模型实例有效:

if ($visitPatient) {
    $visitPatient->save();
}
if ($visitRegister) {
    $visitRegister->save();
}

4. 排查模型字段权限

检查 FP_Patient 和 FP_Register 模型的字段权限设置,确保要更新的字段(如 methods_used_previously、next_appointment 等)不在 $guarded 中,或被包含在 $fillable 中:

// FP_Patient 模型示例
protected $fillable = ['methods_used_previously', 'next_appointment', ...];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:46:10