#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);
});
}
}