【问题标题】:timestamp changing without modifyng the field in the db时间戳更改而不修改数据库中的字段
【发布时间】:2018-08-18 15:30:48
【问题描述】:

我的数据库中的'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();

当用户创建一个任务时,他们可以给这个任务一个 end_date。我在 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 个输入字段,所以我必须在 store 函数中将它们合并在一起:

 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 创建了一个具有以下结束日期的任务 = 08/18/2018 20:14 请注意,这个时间是针对 UTC+2 的,所以我是说将其转换为 UTC。

在存储功能之后,我检查了数据库,如下 end_date = 2018-08-18 18:14:00 哪个是正确的,现在让我们看看我运行更新函数时的 end_date 是什么:

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

所以仍然是相同的值,但是如果我正常运行更新功能并检查数据库,这就是我的值: 2018-08-18 17:24:27,我注意到我的 updated_at 字段具有相同的最后 2 位数字,所以它以某种方式占用了我假设的当前时间。我的 updated_at 字段:2018-08-18 15:24:27

知道我在这里做错了什么吗?

【问题讨论】:

  • 记录更新时,时间戳会在db级别更新。使用日期时间等,这样您就可以真正只在需要时对其进行变异,而不是在您不希望的情况下由数据库控制。
  • 所以我必须将迁移表更改为日期时间而不是时间戳?
  • 是的,我认为应该可以解决问题
  • 这对我有用,很有帮助!
  • 我现在将其放在答案中,以便将来对其他人更有帮助。

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


【解决方案1】:

时间戳由数据库控制,当记录更新时,它会反映这一点。要拥有仅在您需要时更改的自定义字段,请使用 datetime。

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2016-08-23
    • 1970-01-01
    • 2010-10-12
    • 2014-10-11
    相关资源
    最近更新 更多