【问题标题】:Is laravel created_at and updated_at inverse?laravel created_at 和 updated_at 是相反的吗?
【发布时间】:2016-04-05 22:09:28
【问题描述】:

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

【问题讨论】:

  • 这听起来很奇怪。
  • 请发布您的模型和导致反向更改的代码。
  • 显然这是不正确的(与重复的问题相同)-created_at 列不应该有 on update CURRENT_TIMESTAMP
  • @MarcinNabiałek 谢谢。好像是mariadb的版本导致的问题?

标签: sql laravel laravel-5 eloquent laravel-5.2


【解决方案1】:

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

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

【讨论】:

  • 是的,你是对的。这似乎是因为 mysql 的默认行为。 THIS ISSUE 我正在尝试提供一个默认值来避免这种情况。
【解决方案2】:

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

MySQL 5.7 不再允许 0000-00-00 作为有效时间戳 严格模式已打开(默认情况下)。所以要么使用 -&gt;nullableTimestamps()-&gt;timestamp()-&gt;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。

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

【讨论】:

  • 谢谢。我已经编辑了蓝图并修复了这个问题:)
【解决方案3】:

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

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

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

}

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

【讨论】:

  • 谢谢。似乎 laravel 现在已经通过附加 '->nullable()' 修复了它。 :)
猜你喜欢
  • 2018-09-16
  • 1970-01-01
  • 2015-11-26
  • 2014-08-15
  • 2019-01-22
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多