2015-06-15 71 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;