
本文介绍在 laravel 中使用 eloquent 实现字段内容的追加式更新,而非覆盖式更新,通过拼接新旧值实现如 “test1 test2” 的效果,避免丢失原始数据。
在 Laravel 开发中,若需对数据库某字段执行“追加更新”(即保留原内容并在其后添加新内容),而非默认的“覆盖更新”,不能直接赋值覆盖,而应显式读取当前值、拼接新内容后再保存。
例如,假设 Invoice 模型的 note 字段原值为 "test1",用户提交新备注 "test2",期望结果为 "test1 test2",则应采用以下写法:
$invoice = Invoice::find($request->input('session_cat_invoice'));
// ✅ 正确:读取原值 + 拼接新内容(注意空格等分隔符处理)
$invoice->note = $invoice->note . ' ' . $request->input('invoice_note');
$invoice->save();⚠️ 注意事项:
-
空值安全:若 note 可能为 null 或空字符串,建议增加判空处理,避免生成多余空格或 null test2:
$newNote = $request->input('invoice_note'); $invoice->note = trim($invoice->note ?? '') === '' ? $newNote : $invoice->note . ' ' . $newNote; -
批量更新慎用:上述方式依赖模型实例,适用于单条记录。若需高效批量追加(如多条发票同时追加相同后缀),可考虑使用 DB::raw() 配合 update():
use Illuminate\Support\Facades\DB; Invoice::where('id', $invoiceId) ->update([ 'note' => DB::raw("CONCAT(COALESCE(note, ''), ' ', ?)", [$newNote]) ]); 字符编码与长度限制:拼接前确认字段类型(如 VARCHAR(255))及总长度,防止 Data too long 错误。
-
业务语义清晰化:可将该逻辑封装为模型方法,提升可读性与复用性:
// 在 Invoice.php 模型中 public function appendNote(string $content): self { $this->note = trim($this->note ?? '') === '' ? $content : $this->note . ' ' . $content; return $this; } // 调用:$invoice->appendNote($request->input('invoice_note'))->save();
总结:Eloquent 默认行为是覆盖写入,要实现追加更新,核心在于「先读再拼后写」。合理处理空值、长度和可维护性,即可安全、清晰地满足日志追加、备注累积等典型业务场景。










