在 PHP Laravel 5.x 中编辑后如何保存以前的 MySQL 字段条目?
Posted
技术标签:
【中文标题】在 PHP Laravel 5.x 中编辑后如何保存以前的 MySQL 字段条目?【英文标题】:How to save the previous MySQL field entry after edit in PHP Laravel 5.x? 【发布时间】:2019-08-16 20:55:07 【问题描述】:我正在使用两个 mysql 表。 Tasks(有完整的 MVC)和 Task Archives(只是一个 MySQL 表),两者都有相同的字段。唯一的区别是,从Task编辑后,我希望将更新前的信息存储在Task Archives表中,并且Task会有编辑后的条目,以免被更新覆盖。
我没有做 Eloquent ORM 关系,因为我不需要相互引用任何东西。我也没有为 Task Archives 做控制器或模型,因为除非我需要它来解决我的问题,否则我看不到这样做的任何目的。
//table fields for task and task archive tables
$table->increments('id');
$table->string('task_name');
$table->string('task_notes');
$table->string('task_status');
public function edit($id) //from TasksController
$task = Task::find($id);
return view('tasks.edit')->with('task', $tasks);
public function update(Request $request, $id)
$this ->validate($request,[
'task_name' => 'required',
'task_notes' => 'required',
'task_status' => 'required',
]);
$task = Task::find(id);
$task->task_name=$request->input('task_name')
$task->task_notes=$request->input('task_notes')
$task->task_status=$request->input('task_status')
$task->save
------->insert code here on how to get the pre-updated information of task and save to task archive table
我只是希望将预先更新的信息存储在不同的表中。
【问题讨论】:
【参考方案1】:我建议创建一个名为 task_audit
的新表,然后将触发器(INSERT
、UPDATE
和 DELETE
)附加到您的原始表以处理审计,而不是通过 php 执行此操作。 This 文章很好地解释了触发器。
task
表将包含所有“当前”数据,task_audit
表基本上是发生更改时行的副本,理想情况下,您还可以附加一个名为 audit_action
的列,以便区分在发生的操作之间(INSERT
、UPDATE
或 DELETE
)。您需要将三个触发器(用于三个操作)附加到您的“主”表中,以便在审计表中记录更改的数据。
使用此方法,您可以轻松地从任何日期重新构建任务,因为您拥有所有存档数据并且它也可以用于报告。
【讨论】:
那么这将是三个表?另外我如何附加触发器以及它们应该附加在哪里? 不,这将是两个表,让我进一步澄清。触发器附加到表中,您可以使用 PMA / 原始查询来附加创建它们 - 我的答案中的链接应该会有所帮助。【参考方案2】:您可以使用的另一种方法是利用Eloquent model events。通过在引导方法中使用static::saved
,您可以使用getOriginal()
访问原始值并将其保存到另一个表中。例如,这是我的一个模型:
class Item extends Eloquent
public static function boot()
parent::boot();
static::saved(function($item)
$data = [
'row_id' => $item->id,
'previous_quantity' => $item->getOriginal('quantity', 0),
'new_quantity' => $item->quantity,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
];
DB::table('update_log')->insert($data);
);
【讨论】:
以上是关于在 PHP Laravel 5.x 中编辑后如何保存以前的 MySQL 字段条目?的主要内容,如果未能解决你的问题,请参考以下文章
解决laravel环境在Ubuntu下使用php artisan 创建文件后无法在phpstorm中编辑的问题
在 Windows 上快速安装并运行 Laravel 5.x