更改时间戳而无需修改数据库中的字段

时间:2018-08-18 15:30:49

标签: php mysql datetime laravel-5 php-carbon

我的数据库上的'end_date'列有问题。首先,我正在做一个待办事项应用程序。因此,我有一个名为'Tasks'的表,其中包含以下列:

$table->increments('id');
$table->integer('user_id');
$table->string('title');
$table->mediumText('description');
$table->timestamp('end_date');
$table->integer('completed');
$table->timestamps();

当用户创建任务时,他们可以给该任务一个结束日期。我位于UTC + 2时区,因此对于用户,我一直在UTC + 2中显示所有时间,但是我将它们存储在数据库中的UTC中。

以下是带有实际存储功能的输入字段:

{{Form::date('end_date', \Carbon\Carbon::now()->timezone('Europe/Brussels'),['class' => 'form-control mb-2 mr-sm-2 mb-sm-0'])}}
{{Form::time('time', \Carbon\Carbon::now()->timezone('Europe/Brussels')->format('H:i'),['class' => 'form-control'])}}

因为我要使用2个输入字段,所以必须在存储功能中将它们合并在一起

 public function store(Request $request)
{
     $requestData = $request->all(); 
     $task = new Task($requestData);
     $inputDateAndTime = $requestData['end_date'].' '.$requestData['time'].':00';
     $task['end_date'] = Carbon::createFromFormat('Y-m-d H:i:s', $inputDateAndTime, 'Europe/Brussels')->timezone('UTC');
     $task['user_id'] = auth()->id();
     $task['completed'] = 0;
     $task->save();

    return redirect('/tasks')->with('success', 'Task created');
}

在此函数中,我指定用户给定的时间为UTC + 2时区,我希望将其转换为UTC。 (这按预期工作)

问题:因此,如果用户希望完成此任务,则可以执行PUT请求以更新'completed'列,但是在处理此请求时,我的end_date列是在同一时间更改而根本不触及该列。

我的更新功能:

public function update(Request $request, Task $task)
{
       $task -> completed = 1;
       $task->save();

       return redirect('/tasks')->with('success', 'Task completed');
}

问题示例:

我们假设用户1创建了一个任务,任务的结束日期为{{1} 请注意,这次是针对UTC + 2,所以我是说将其转换为UTC。

使用存储功能后,我检查数据库,并带有以下end_date = 08/18/2018 20:14 哪个是正确的,现在让我看看运行更新功能时我的end_date是什么:

2018-08-18 18:14:00

所以仍然是相同的值,但是如果我正常运行更新功能并检查数据库,则这是我的值:  public function update(Request $request, Task $task) { dd($task->end_date); // the result: Carbon @1534616040 {#552 ▼ date: 2018-08-18 18:14:00.0 utc(+00:00) } } ,我注意到的是我的updated_at字段具有相同的后两位数字,因此以某种方式占用了我假设的当前时间。我的Updated_at字段:2018-08-18 17:24:27

知道我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

时间戳是由db控制的,它在记录更新时会反映出来。要使自定义字段仅在需要时更改,请使用datetime。