2015-06-15 42 views
9

我正在使用Laravel 5.1。为简单起见,我有以下的代码雄辩模型不更新updated_at时间戳

迁移:

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(); 

它的工作原理。然而,文档说这应该自动发生,所以这里有什么问题?

我搜索过这个问题上的计算器一些网站,但那些我发现其中对于Laravel 3或4.1,4.2等

我怎么会做对了吗?

+5

如果没有更改记录数据,那么就不会被更新.....这只是不必要的开销....和'$ sitemapData = SitemapData :: firstOrNew([ “postUrl” => $ post ]); $ sitemapData-> save();'不以任何方式改变记录数据 –

+0

啊好吧!我认为updated_at不管更改与否都会更新。你是对的,我没有改变,我只是想检查它是否有效。谢谢。现在这是有道理的 – Musterknabe

+1

不,这是Laravel试图变得聪明的地方,如果没有必要的话,避免数据库调用的花费 –

回答

17

正如在评论中提到的,如果模型没有改变,时间戳不会被更新。但是,如果你需要进行更新,或者要检查,如果一切正常的使用$model->touch() - 更here

+0

'created_at'怎么样。我遇到了一个错误,其中'created_at'设置为0,但'updated_at'正确。 'updated_at'可能稍后更新。但是我无法重新生成这个问题。这只是一个随机的情况。 – Cybersupernova

1

有可能实际上是:

$model->updated_at = Carbon::now(); 
$model->save(['timestamps' => FALSE]); 

这将妥善保存updated_at到现在。如果您不确定模型的任何栏目是否已更改,但您确实想更新updated_at,无论如何 - 这是要走的路。

0

呀什么Musterknabe所做的是正确的,但他也应该检查他的模型SitemapData.php它应该有已设置$时间戳= TRUE;

1 <?php 
2 
3 class SitemapData extends Eloquent { 
4 
5   public $timestamps = true;