2012-07-07 87 views
0

我試圖創建一個使用Symfony 2和Doctrine 2的小型論壇應用程序。我的ForumTopic實體有一個last_post字段(oneToOne映射)。現在當我堅持我的新職位Symfony 2 - 基於另一個表中新插入的記錄更新表

$em->persist($post); 

我想更新我的ForumTopic實體,所以它的last_post字段將引用這個新的職位。我剛剛意識到,它不能與教義postPersist監聽器來完成,所以我決定用一個小黑客,並嘗試:

$em->persist($post); 
$em->flush(); 
$topic->setLastPost($post); 
$em->persist($post); 
$em->flush(); 

,但它似乎沒有更新我的主題表。

我也看看http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/working-with-associations.html#transitive-persistence-cascade-operations希望通過在我的Topic.orm.yml文件中添加級聯:['persist']來解決問題,但它也沒有幫助。

任何人都可以指向我的解決方案或示例類嗎?

我ForumTopic是:

FrontBundle\Entity\ForumTopic: 
     type: entity 
     table: forum_topics 
     id: 
       id: 
         type: integer 
         generator: 
           strategy: AUTO 
     fields: 
       title: 
         type: string(100) 
         nullable: false 
       slug: 
         type: string(100) 
         nullable: false 
       created_at: 
         type: datetime 
         nullable: false 
       updated_at: 
         type: datetime 
         nullable: true 
       update_reason: 
         type: text 
         nullable: true 
     oneToMany: 
       posts: 
         targetEntity: ForumPost 
         mappedBy: topic 
     manyToOne: 
       created_by: 
         targetEntity: User 
         inversedBy: articles 
         nullable: false 
       updated_by: 
         targetEntity: User 
         nullable: true 
         default: null 
       topic_group: 
         targetEntity: ForumTopicGroup 
         inversedBy: topics 
         nullable: false 
     oneToOne: 
       last_post: 
         targetEntity: ForumPost 
         nullable: true 
         default: null 
         cascade: [ persist ] 
     uniqueConstraint: 
       uniqueSlugByGroup: 
         columns: [ topic_group, slug ] 

而且我ForumPost是:

FrontBundle\Entity\ForumPost: 
     type: entity 
     table: forum_posts 
     id: 
       id: 
         type: integer 
         generator: 
           strategy: AUTO 
     fields: 
       created_at: 
         type: datetime 
         nullable: false 
       updated_at: 
         type: datetime 
         nullable: true 
       update_reason: 
         type: string 
         nullable: true 
       text: 
         type: text 
         nullable: false 
     manyToOne: 
       created_by: 
         targetEntity: User 
         inversedBy: forum_posts 
         nullable: false 
       updated_by: 
         targetEntity: User 
         nullable: true 
         default: null 
       topic: 
         targetEntity: ForumTopic 
         inversedBy: posts 
+0

有趣的是:在我將映射信息轉換爲註釋之後,它的功能就像魅力一樣... – GergelyPolonkai 2012-07-13 11:55:32

回答

0

我相信你正在做自己該更加困難,因爲你認爲你必須刷新你的帖子然後才能將其設置爲關於您的主題的關聯。

學說足夠聰明,如果你堅持一個實體並在沒有先調用flush的情況下將它設置爲一個關聯,它將確保當你調用flush時,它首先堅持該實體,以便它具有一個ID可以與該關聯一起使用。

這意味着什麼是你真正需要做的是這樣的:

// Assume that topic has been fetched from the DB, and post is completely new 
$topic = $em->find('TopicModel', $topicId); 
$post = new ForumPost(); 
// Fill in the post info 
// Set up the association 
$topic->setLastPost($post); 
// And finally, persist and flush - no more effort needed 
$em->persist($post); 
$em->flush(); 

這方面的一個很好的副作用是,你可以簡單地使用一個prePersist事件偵聽器來更新線程的最後一個職位 - 學說會照顧你的一切。另外,如果你想要一個可以更容易地遵循邏輯的方法,你可以讓你的Post模型自己調用setLastPost這個主題 - 例如,如果你在構造函數或setTopic中設置了帖子的主題()方法,在那裏添加setLastPost調用。

這樣做是相對常見的做法,讓協會的一方照顧雙方,以保持良好的同步 - 請參閱Working with Associations

+0

我試過了後一種方法,但Doctrine似乎沒有在forum_topics表上做更新。我甚至試圖調用$ em-> persist($ topic),但它是一樣的,沒有效果。 – GergelyPolonkai 2012-07-08 22:52:46

+0

嗯,有趣 - 有三種情況,我知道這可能導致: 1.主題實體不由EntityManager管理,因此它無法檢測到更改(如果您從數據庫中獲取主題,它不太可能是這樣的) 2.該關聯沒有被正確映射(僅對關聯的擁有一側進行更改) 3。主題實體配置了明確的或通知的變更跟蹤 您是否可以使用兩種模型的映射更新您的問題以幫助診斷? – 2012-07-09 05:37:08

相關問題