【问题标题】:How to save the previous MySQL field entry after edit in PHP Laravel 5.x?在 PHP Laravel 5.x 中编辑后如何保存以前的 MySQL 字段条目?
【发布时间】: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
    }

我只是希望将预先更新的信息存储在不同的表中。

【问题讨论】:

    标签: php mysql laravel model


    【解决方案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);
    
            });
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 2023-03-30
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2018-09-23
      • 2011-03-11
      • 2015-04-21
      相关资源
      最近更新 更多