我正在使用Laravel 5.1。为了简单起见,我有以下代码
迁移:
Schema::create('sitemap_data', function (Blueprint $table) {
// Primary and foreign keys
$table->increments('id');
$table->string('postUrl');
// Database functions
$table->timestamps();
});
这是我在其他地方使用的代码
$sitemapData = SitemapData::firstOrNew([
'postUrl' => $post
]);
$sitemapData->save();
现在,根据Laravel文档
同样,updated_at时间戳将自动更新,因此无需手动设置其值
应在表中更新updated_at值。但是,这并没有发生。
它仅在第一次插入时设置,但不在更新时设置。当我手动执行此操作时,如下所示
$sitemapData = SitemapData::firstOrNew([
'postUrl' => $post
]);
$sitemapData->updated_at = Carbon::now();
$sitemapData->save();
它有效。但是,文档说这应该自动发生,那么这里有什么问题呢?
我已经在stackoverflow上搜索了一些网站来寻找这个问题,但是我找到了Laravel 3或4.1,4.2等的网站。
我该如何正确执行此操作?
如注释中所述,如果模型没有更改时间戳,则不会更新。但是,如果您需要更新它们,或者想检查一切是否正常,请使用$model->touch()
- 更多 这里
问题中不是这种情况,但如果使用的是查询生成器而不是雄辩模型,则会发生相同的问题。
如果你这样做
DB::table('users')->where()->update()
而不是
User::where()->update()
updated_at不会更新。
实际上有可能:
$model->updated_at = Carbon::now();
$model->save(['timestamps' => FALSE]);
这将适当地保存updated_at
到现在。如果您不确定模型的任何列是否已更改,但无论如何都希望更新updated_at
- 这是要走的路。
是的,Musterknabe所做的是正确的,但他也应该检查他的模型SitemapData.php它应该设置$timestamps = true;
<?php
class SitemapData extends Eloquent {
public $timestamps = true;
}
转到phpmyadmin并选择您的数据库并选择表点击上面的SQL选项卡,然后键入例如以下内容:
UPDATE `boshogriq_table` SET `updated_at`= DATE_ADD(`created_at`, INTERVAL 1 MINUTE)
WHERE `updated_at` > DATE_ADD(`created_at`, INTERVAL 10 MINUTE)
通过"转到"按钮运行它。拉拉维尔不会允许你这样做