0

我正在尝试使用 Symfony 2 和 Doctrine 2 创建一个小型论坛应用程序。我的 ForumTopic 实体有一个 last_post 字段(oneToOne 映射)。现在,当我坚持我的新帖子时

$em->persist($post);

我想更新我的 ForumTopic 实体,以便它的 last_post 字段引用这个新帖子。我刚刚意识到它不能用 Doctrine postPersist Listener 完成,所以我决定使用一个小技巧,并尝试:

$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 文件中添加 cascade: [ 'persist' ] 来解决问题,但它也没有帮助。

谁能指出我的解决方案或示例课程?

我的论坛主题是:

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 ]

我的论坛帖子是:

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
4

1 回答 1

0

我相信您让这件事变得更加困难,因为您认为您必须先刷新您的帖子,然后才能将其设置为与您的主题相关的关联。

Doctrine 足够聪明,如果您持久化一个实体并将其设置为关联而不首先调用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 事件侦听器来更新线程的最后一篇文章 - Doctrine 将为您处理其他所有事情。

或者,如果您想要一种在逻辑上更容易遵循的方法,您可以让您的 Post 模型自己在主题上调用 setLastPost - 例如,如果您在构造函数或 setTopic() 方法中设置帖子的主题,在那里添加 setLastPost 调用。

让关联的一方像这样照顾双方是相对常见的做法,以帮助保持良好的同步 - 请参阅使用关联

于 2012-07-08T06:32:27.420 回答