2013-08-01 159 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 –

相关问题