2

Laravel 框架版本 5.2.5

当我更新一条记录时,update_at 没有更改,但 created_at 更改为当前时间戳。

这个对吗?

MariaDB [月亮]> 显示来自用户的列;
+----------------+------------------+------+------+ ---------------------+---------------------------- -+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+----------------+------------------+------+------+ ---------------------+---------------------------- -+
| 编号 | int(10) 无符号 | 否 | 优先级 | 空 | 自动增量 |
| 姓名 | varchar(255) | 否 | | 空 | |
| 电子邮件 | varchar(255) | 否 | 统一 | 空 | |
| 密码 | varchar(60) | 否 | | 空 | |
| 记住令牌 | varchar(100) | 是 | | 空 | |
| created_at | 时间戳 | 否 | | CURRENT_TIMESTAMP | 在更新 CURRENT_TIMESTAMP |
| 更新时间 | 时间戳 | 否 | | 0000-00-00 00:00:00 | |
+----------------+------------------+------+------+ ---------------------+---------------------------- -+
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
}
4

3 回答 3

2

最近很多人都有这个问题,你可以在这里阅读 Github 上的讨论:https ://github.com/laravel/framework/issues/11518

MySQL 5.7 不再允许 0000-00-00 作为打开严格模式的有效时间戳(默认情况下)。所以要么使用 ->nullableTimestamps()要么->timestamp()->useCurrent()

你可以通过改变这个来解决这个问题:

$table->timestamps();

对于以下任一选项:

// Option 1:
$table->nullableTimestamps();

// Option 2:
$table->timestamp('updated_at')->useCurrent();
$table->timestamp('created_at')->useCurrent();

此外,在这个 MySQL 页面上:https ://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

或者,如果explicit_defaults_for_timestamp禁用(默认),请执行以下任一操作:

使用指定常量默认值的 DEFAULT 子句定义列。

指定 NULL 属性。这也会导致列允许 NULL 值,这意味着您不能通过将列设置为 NULL 来分配当前时间戳。分配 NULL 会将列设置为 NULL。

无论哪种情况,上述解决方案都可以解决您的问题。

于 2016-01-01T20:22:09.703 回答
0

查看您的数据库结构,问题on update CURRENT_TIMESTAMP出在created_at列。显然不应该是这样的。查看迁移它不太可能自动设置此迁移,因此可能已在 MySQL 中手动设置,因此您应该删除on update CURRENT_TIMESTAMPcreated_at

当你使用 Eloquent 更新你的模型时,updated_at列应该更新没有问题(也在当前数据库模式中)——如果不是,你可能不使用 Eloquent,所以它不会自动更新。如果您不确定,请显示您的代码如何更新此记录

于 2016-01-01T11:03:19.217 回答
0

大家好,我的名字是来自伊朗的 arash laghaei 我解决了这个问题,请这样做:vendor/laravel/framework/srs/illuminate/database/schema/blueprint.php line:792

 public function timestamps()
{
    $this->timestamp('updated_at');

    $this->timestamp('created_at')->useCurrent();

}

请按我写的那样做。并解决了这个问题。

于 2016-03-03T19:05:43.333 回答