2013-08-01 158 views
1

我有Post實體。它有Life Cycle Callbacks@ORM\HasLifecycleCallbacks和代碼:學說:從另一個實體更新一個實體

/** 
* @ORM\PrePersist 
* @ORM\PreUpdate 
*/ 
public function updateTimestamps() 
{ 
    $this->post->setUpdatedAt(new DateTime('now')); 
} 

我也有Comment實體。 Comment有一個(或屬於)Post

我想更新Post#updatedAtComment已更新。我該怎麼做?

+1

'$ this-> getPost() - > updateTimestamps()'? – meze

+0

我不會在沒有flush()的情況下工作。 – DmitryR

回答

0

您的LifecycleCallbacks應該位於Comment實體中,因爲您想從那裏觸發它。回調函數應該是這樣的:

public function updatePostTimeStamp() { 
    $this->getPost()->setUpdatedAt(new \DateTime('now')); 
} 

創建或更新評論的用戶後,你需要做一個堅持()的意見,並在後。然後你可以做一個flush()並且一切都會被存儲。需要在post()上保留更新發布表。

+0

爲什麼我應該使用'persist()'來存儲已存儲在數據庫中的實體?我也需要'em'到'flush()'。 – DmitryR

+0

堅持不僅是爲INSERT語句,而且爲UPDATE。帖子需要更新以更新帖子的時間戳。這對於Doctrine來說並不特別,使用原生SQL你也必須這樣做。也許updatePostTimeStamp()應該被稱爲updatePostLastEventTimeStamp()。或者,您可以查詢與Post相關的所有事件並執行MAX(UpdatedAt)。 – Flip

0
/** @ORM\PrePersist @ORM\PreUpdate */ 
public function updatePostTimeStamp() { 
    $this->post->setUpdatedAt(new \DateTime('now')); 
    // you should get doctrine entity manager. e.g. 
    // $em= MagicSingleton::getDoctrine() 
    $em->persist($this->getPost()); 
} 
+0

無法確定EntityManager。該應用程序包含68個EntityManagers(應用程序/控制檯容器:debug | grep ORM.EntityManager | wc -l),實體不應該知道有關EM的任何內容。 – DmitryR

+1

事件監聽器怎麼樣? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#listening-and-subscribeing-to-lifecycle-events –

相關問題