2009-09-13 65 views
0

這必須很簡單... 我試圖保留當前日期已存儲在DB中的updated_at字段。
我正在更新同一行中的單個字段值,然後保存,但我不希望它更新updated_at字段。 我想保留現有的updated_at值。在Symfony中保存數據庫時,如何保留updated_at日期字段?

我只想在一個,也許兩種情況下做到這一點,所以我不需要覆蓋程序中的其他任何動作的模型。

我已經試過這樣:

$originalDate = $this->getUpdatedAt(); 
$this->setUpdatedAt($originalDate); 
$this->save(); 

這似乎是它應該工作,但它仍然看起來更新的領域。

+0

推動還是學說?請明確指出。 – develop7 2010-03-29 10:46:29

+0

我在問如何在Propel ORM中執行此操作 – Failpunk 2010-04-30 00:32:41

回答

0

在symfony中,通常當一個表有一列名爲created_at時,它被用來存儲記錄創建日期的時間戳。 updated_at列同樣適用於每次更新記錄本身時將其更新爲當前時間值的列。

好消息是,symfony會識別這些列的名稱並處理它們的更新。您不需要手動設置created_atupdated_at列;他們會自動更新。

如果要保留其他信息created_atupdated_at您應該創建另一個字段。

+0

有沒有辦法在需要時覆蓋此行爲?我不想只爲一個行爲改變數據庫結構和整個模型。 – Failpunk 2009-09-13 23:04:22

+0

@Failpunk:默認情況下,存儲在項目的「lib」目錄中的類會自動從自動加載中受益。您可以在官方文檔中找到有關這些文件夾的更多信息。 – ranonE 2009-09-14 07:29:52

1

那麼看來這個微小變化的工作原理:

$originalDate = $this->getUpdatedAt(); 
$this->save(); 

$this->setUpdatedAt($originalDate); 
$this->save(); 

但必須有一個更優雅的方式,這樣你就不必做兩個獨立的撲救。

3

僅當updated_at列的列未被更改時纔會被設置爲當前時間。這是用isColumnModified方法檢查的。如果您首先將其更改爲某個值,然後將其更改回原始值,則可以欺騙該對象以相信這已被修改。

$updatedAt = $book->getUpdatedAt(); 
$book->setUpdatedAt(null); 
$book->setUpdatedAt($updatedAt); 

$book->setInStock(4); 
$book->save(); 

在Symfony的1.2,此行爲在SfObjectBuilder::addSave()加入,並且不能被禁止(它檢查名爲updated_atupdated_on列)。在Symfony 1.3和1.4中,使用了Propel 1.4的更新行爲,所以我認爲你必須明確地添加它們才能獲得效果。同樣的技巧可以繞過更新。

相關問題