
当 Laravel 模型中已正确声明 $fillable,但 update() 无法更新指定字段(如 text)时,通常是因为 update() 方法仅接受数组参数批量赋值,而直接修改模型属性后调用 update() 不会生效;应改用 save() 方法持久化属性变更。
当 laravel 模型中已正确声明 `$fillable`,但 `update()` 无法更新指定字段(如 `text`)时,通常是因为 `update()` 方法仅接受数组参数批量赋值,而直接修改模型属性后调用 `update()` 不会生效;应改用 `save()` 方法持久化属性变更。
在 Laravel 中,update() 和 save() 是两种语义不同的数据持久化方式:
✅ save():适用于已加载模型实例的场景。它会将模型当前所有已修改的属性(包括通过 $model->field = $value 赋值的字段)同步到数据库,并自动触发模型事件(如 updating/updated)、时间戳更新(updated_at)及批量赋值检查(基于 $fillable 或 $guarded)。这是你当前代码最合适的修复方式。
❌ update()(无参数):不执行任何操作——它是一个静态方法,设计用于接收键值对数组(如 ->update(['text' => $value])),而非实例方法。你在代码中调用的 $assigned->update() 实际上是调用了 Eloquent 的 实例方法 update(),但它内部仍期望传入数据数组;若不传参,它将跳过更新逻辑(Laravel 9+ 会抛出 BadMethodCallException,旧版本则静默忽略)。
观察你 dump($assigned) 的输出可发现关键线索:
#original: array:7 [ "text" => null // ← 数据库原始值为 null ] #changes: [] // ← 当前无待提交的变更(因 update() 未触发属性跟踪)
这说明模型并未识别 text 字段已被修改——因为 update() 未被正确调用,$assigned->text = $p['text'] 的赋值未被持久化机制捕获。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
✅ 正确写法(推荐):
foreach ($request->assigned['standards'] as $standard) {
if (!empty($standard['plannings'])) {
foreach ($standard['plannings'] as $p) {
$assigned = PerformanceManagementSetModuleStandardAssignedPlanning::where('id', $p['id'])
->where('performance_management_set_assigned_id', $request->assigned_id)
->first();
if ($assigned) {
$assigned->text = $p['text'];
$assigned->user_id = 1; // 示例赋值
$assigned->save(); // ✅ 使用 save() 提交所有已修改属性
}
}
}
}
⚠️ 注意事项:
- 始终检查模型是否成功查找到(if ($assigned)),避免对 null 调用 save() 导致异常;
- 若需批量更新且不触发模型事件或时间戳,可改用查询构造器:
PerformanceManagementSetModuleStandardAssignedPlanning::where('id', $p['id']) ->where('performance_management_set_assigned_id', $request->assigned_id) ->update(['text' => $p['text'], 'user_id' => 1]); - 确保数据库字段类型支持存入内容(如 text 字段是否为 TEXT 类型,而非 VARCHAR(255) 截断);
- 避免在循环中频繁查询——可预先用 whereIn 一次性加载所有目标记录,再通过 PHP 关联更新,显著提升性能。
总结:$model->attribute = $value; $model->update(); 是常见误区;记住——修改属性后调用 save(),传递数组时才用 update([...])。










