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会在某些条件下自动分配默认的当前时间戳或更新当前时间戳属性 基本上,你有三个选择
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