1

我有两个模型:

线程 <-OneToMany-> 发布

有没有办法让双方都“拥有”?如果没有,这样做的首选方式是什么?

基本上,我想要这种情况:

// When called:
$post->setThread($thread);
$documentManager->persist($post);

// This gets called too, implicitly
$thread->addPost($post);
$documentManager->persist($thread);


// But also, when I call
$thread->addPost($post);
$documentManager->persist($thread);

// This gets called implicitly
$post->setThread($thread);
$documentManager->persist($post);



// When I remove post from thread
$thread->removePost($post);
$documentManager->persist($thread);

// This gets called implicitly
$post->setThread(null);
$documentManager->persist($post);

Etc.

如您所见,我需要具有持久性和更新级联的双向同步。

我可以在模型本身中指定此行为以使它们保持同步,但它存在一个问题:如果另一侧是已编辑的实体,则 Doctrine 不会自动保存拥有实体。

我正在使用 Doctrine Mongo ODM,但我想它对 ORM 应该没有太大的影响?

4

1 回答 1

0

首选方法是将 Post 设置为拥有方。在语义上这会有点奇怪,因为一个 Thread 拥有一个 Post。但在数据库世界中,Post 拥有 Thread 的外键,因此 Post 是拥有方,thread 是反方。有关更多信息,请在此处阅读:http: //docs.doctrine-project.org/en/latest/reference/unitofwork-associations.html

您的问题“如果另一侧是已编辑的实体,则 Doctrine 不会自动保存拥有实体。” 那里也记录为“仅对关联的反面所做的更改被忽略。”。因此,您只需保持一致,并始终更新关系的拥有方。在拥有方方法中更新反向方以保持同步是一个好主意。那就是..在PHP中与您的对象同步,无论如何数据库只需要知道拥有方...

于 2013-08-04T20:09:25.023 回答