在 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 的新表,然后将触发器(INSERTUPDATEDELETE)附加到您的原始表以处理审计,而不是通过 php 执行此操作。 This 文章很好地解释了触发器。

task 表将包含所有“当前”数据,task_audit 表基本上是发生更改时行的副本,理想情况下,您还可以附加一个名为 audit_action 的列,以便区分在发生的操作之间(INSERTUPDATEDELETE)。您需要将三个触发器(用于三个操作)附加到您的“主”表中,以便在审计表中记录更改的数据。

使用此方法,您可以轻松地从任何日期重新构建任务,因为您拥有所有存档数据并且它也可以用于报告。

【讨论】:

那么这将是三个表?另外我如何附加触发器以及它们应该附加在哪里? 不,这将是两个表,让我进一步澄清。触发器附加到表中,您可以使用 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

Laravel 5.x 数据库触发器和可能的最佳实践

markdown Urantu 16.x上的Laravel 5.x,PHP 7.x,Nginx 1.9.x.

在 Laravel 5.x 中获取“类不存在”

如何更改 Laravel Artisan CLI PHP 版本?