Как сохранить предыдущую запись поля MySQL после редактирования в PHP Laravel 5.x?

#php #mysql #laravel #model

#php #mysql #laravel #Модель

Вопрос:

Я работаю с двумя таблицами MySQL. Задачи (имеет полный MVC) и архивы задач (просто таблица MySQL), оба имеют одинаковые поля. Единственное отличие заключается в том, что после редактирования из Task я хочу, чтобы предварительно обновленная информация сохранялась в таблице архивов задач, и задача будет иметь отредактированную запись, чтобы избежать перезаписи из обновления.

Я не делал красноречивого отношения ORM, поскольку мне не нужно ссылаться ни на что друг от друга. Я также не создавал контроллер или модель для архивирования задач, поскольку я не вижу никакой цели делать это, если только мне это не понадобится для решения моей проблемы.

 //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. В этой статье хорошо объясняются триггеры.

task Таблица содержала бы все «текущие» данные, и task_audit таблица в основном представляла бы собой копии строк, когда происходят изменения, в идеале, вы также должны прикрепить столбец с именем audit_action , чтобы вы могли различать произошедшее действие ( INSERT , UPDATE или DELETE ). Вы бы прикрепили три триггера (для трех действий) к вашей «основной» таблице, чтобы она записывала измененные данные в таблицу аудита.

Используя этот метод, вы сможете легко перестроить задачу с любой даты, поскольку у вас есть все архивные данные, и их также можно использовать для составления отчетов.

Комментарии:

1. Значит, тогда было бы три таблицы? Также как мне прикрепить триггеры и куда они должны быть прикреплены?

2. Нет, это будут две таблицы, позвольте мне пояснить подробнее. Триггеры прикреплены к таблицам, вы можете использовать запросы PMA / raw для прикрепления их создания — ссылка в моем ответе должна помочь.

Ответ №2:

Другой метод, который вы можете использовать, — воспользоваться событиями Eloquent model. Используя 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);

        });

    }
}