Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 更新时创建的LAVEL更改_Php_Laravel_Laravel 5_Eloquent_Laravel 5.2 - Fatal编程技术网

Php 更新时创建的LAVEL更改

Php 更新时创建的LAVEL更改,php,laravel,laravel-5,eloquent,laravel-5.2,Php,Laravel,Laravel 5,Eloquent,Laravel 5.2,我在这个问题上找到了答案,但对我来说不起作用 因此,我在数据库中做了一个条目: // Write lead to database $lead = Lead::create($lead_data); 时间戳如下所示,这很好: | 2016-01-08 10:34:15 | 2016-01-08 10:34:15 | 但随后我向外部服务器发出请求,我需要更新行: $lead->user_id = $response['user_id']; $lead->broker_id = $r

我在这个问题上找到了答案,但对我来说不起作用

因此,我在数据库中做了一个条目:

// Write lead to database
$lead = Lead::create($lead_data);
时间戳如下所示,这很好:

| 2016-01-08 10:34:15 | 2016-01-08 10:34:15 |
但随后我向外部服务器发出请求,我需要更新行:

$lead->user_id = $response['user_id'];
$lead->broker_id = $response['broker_id'];
$lead->save();
并且创建的_at字段会发生更改:

| 2016-01-08 04:34:17 | 2016-01-08 10:34:17 |
我如何解决这个问题

编辑

我需要一个解决方案,可以在不删除列或重置迁移的情况下修改行为。必须在不接触数据的情况下对实时数据库执行修复。如下文所述,我尝试了以下迁移:

$table->datetime('created_at')->default(DB::raw('CURRENT_TIMESTAMP'))->change();

但什么也没发生。创建的_at字段在更新时仍会被修改。

如果您使用的是Laravel 5.2并使用MySQL,则时间戳会引入一些“bug”。您可以在github上阅读有关此问题的所有信息。它与时间戳默认值有关,MySQL会在某些条件下自动分配默认的当前时间戳或更新当前时间戳属性

基本上,你有三个选择

  • 更新MySQL变量:
  • 如果将\u timestamp变量的
    explicit\u defaults\u设置为
    TRUE
    ,则不会为时间戳列分配默认的当前\u timestamp或自动更新当前\u timestamp属性。您可以阅读有关该变量的更多信息

  • 使用可为空的时间戳:
  • $table->timestamps()
    更改为
    $table->nullabletimstamps()
    。默认情况下,
    $table->timestamps()
    命令创建不可为空的时间戳字段。通过使用
    $table->nullableTimstamps()
    ,时间戳字段将为空,MySQL不会自动为第一个字段分配默认的当前\u时间戳或更新当前\u时间戳属性

  • 自己定义时间戳:

  • 不要使用
    $table->timestamp
    ,而是使用
    $table->timestamp('updated_at')$表->时间戳('created_at')你自己。确保您的“updated_at”字段是表中的第一个时间戳,这样它将是自动分配默认当前时间戳或更新当前时间戳属性的字段。

    Skatch-我认为您上面的解决方案不太正确,但在这种情况下可能很好

    问题是您得到的是PHP日期,而不是默认的MYSQL时间戳。运行该迁移时,您会得到如下语句:

    alter table alter column created_at default '2016:02:01 12:00:00';
    
    注意日期的字符串。运行迁移时,该日期将始终用于您在处创建的_,而不是在几天后添加记录时的当前日期

    您可以使用DB::raw('current_timestamp')来解决这个问题,而不是执行“date('Y:m:dh:i:s')”


    (sry,不能只在上面添加评论-我的声誉还不够高…

    将此作为顶级答案发布,总结我们的评论讨论

    首先,正如@patricus所指出的那样,在拉拉维尔(Laravel)中引入了一个日期。错误讨论中建议的解决方案是使用nullableTimestamps()而不仅仅是timestamps(),或者直接创建created_at和updated_at字段-
    $table->timestamp('updated_at')->change()

    这也可以通过原始SQL进行修复。类似于此的ALTER语句

    alter table loader_rawvalues MODIFY column updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    
    这可以直接应用于现有的DB表(首先测试它,或者当然!)。或者,您可以使用DB::unprepared()从迁移中应用它-例如:

    class CreateMyTable extends Migration
    {
        public function up()
        {
            Schema::create('mytable', function (Blueprint $table) {
                $table->bigIncrements('id');
                // ...
                $table->timestamps();
            });
    
            DB::unprepared('alter table mytable MODIFY column updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
        }
    }
    

    这一定是表字段定义中的一个问题。我最近也遇到了同样的问题,当我检查我的表时,在
    处创建的
    有一个“
    额外的
    ”,在更新当前时间戳时有值
    ,为了让Laravel正常工作,只需使用如下内容更新字段定义:

    ALTER TABLE table_name CHANGE created_at created_at timestamp NOT NULL default CURRENT_TIMESTAMP;
    

    在执行更新之前,如何加载$lead变量?
    $lead
    变量将使用
    create
    方法填充,但无论如何,我也尝试了
    $lead=lead::find($lead->id)写入后,问题仍然存在。我需要一个可以在实时运行的数据库上实现的解决方案。重置迁移和删除列不是一个选项。这个愚蠢的错误仍然存在于Lara8中。我只有“created_at”字段,所以我必须覆盖更新的_at常量。如果为空,则每次更新时“created_at”都会更改。FALSE解决了问题你是对的,我没想到。无论如何,我尝试了一切,包括您的建议
    $table->datetime('created_at')->default(DB::raw('CURRENT_TIMESTAMP'))->change(),但这是它工作的唯一方式。。。下一次我将尝试更好地使用SQL。您需要通过迁移来实现这一点吗?本机SQL命令是直截了当的:“alter table mytable modify column mycolumn timestamp default current_timestamp NOT NULL on update current_timestamp;”直接在DB上运行该命令,一切都应该得到修复。(先测试!)。如果必须通过迁移来完成,可以使用DB::unprepared($MyRawSQL);。类似于public function up(){Schema::create(..);DB::unprepared($MySQL);}-这也绕过了@patricus提到的bug。是的,原始数据库查询应该可以解决这个问题。。。感谢您的输入,将在下一个项目中派上用场(这一个工作刚刚好了)。在答案中写一个完整的解决方案,我会给你打勾:)我认为你需要修改创建的_at字段,而不需要更新时的
    语句,更新后的_at工作正常。:)为了确认,如果您需要运行迁移来修复出现问题的更新的_,根据sgrover的解决方案,您可以在迁移中为所有需要修复的表添加以下内容,而不删除:
    DB::unprepared('alter table faq modify column created_at timestamp default current_timestamp NOT NULL')
    以及
    DB::unprepared('alter table faq modify column updated_at timestamp default current_timestamp NOT NULL')这将把时间戳设置为默认的C