2013-08-01 6 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#updatedAt при обновлении Comment. Как мне это сделать?

+1

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

+0

Я не буду работать без флеша(). – DmitryR

ответ

0

Ваш LifecycleCallbacks должен находиться в объекте Comment, потому что вы хотите вызвать его оттуда. Ваша функция обратного вызова должна выглядеть следующим образом:

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

После пользователь создан или обновлен комментарий, вам нужно сделать упорствовать() на комментарии, а также на посту. Затем вы можете сделать флеш(), и все будет сохранено. Сохранение в post() необходимо для обновления таблицы сообщений.

+0

Почему я должен использовать 'persist()' для объектов, которые уже хранятся в базе данных? Также мне нужно получить 'em' для' flush() '. – DmitryR

+0

Persist - это не только оператор INSERT, но и UPDATE. Сообщение необходимо обновить, чтобы обновить метку времени публикации. Это не является особенностью Doctrine, и с собственным SQL вы тоже должны это сделать. Возможно, updatePostTimeStamp() следует называть updatePostLastEventTimeStamp(). В качестве альтернативы вы можете запросить все события, связанные с почтой, и выполнить MAX (обновленныйAt). – 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-subscribing-to-lifecycle-events –

0

На этой странице документации, в самом низу, есть некоторые предложения, сделанные относительно того, как приспособить нечто более сложное: http://symfony.com/doc/current/doctrine/lifecycle_callbacks.html

Короче говоря, эти события жизненного цикла должны быть для вызова внутренней функции в вашем а не для связи между различными объектами. Для этого вы хотите использовать прослушиватели/подписчики событий. Эта другая статья очень похожа на этот вопрос и может дать еще несколько рекомендаций: Doctrine2 Entity PrePersist - Update another entity

Смежные вопросы