Doctrine2两个拥有的一方

时间:2013-07-28 14:16:18

标签: php doctrine-orm

我有两种模式:

线程< -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产生太大影响吗?

1 个答案:

答案 0 :(得分:0)

优先方式是将Post设置为拥有方。在语义上,这有点奇怪,因为一个线程拥有一个帖子。但是在数据库世界中,Post拥有一个Thread的外键,因此Post是拥有者并且反向交叉。有关详细信息,请参阅此处:http://docs.doctrine-project.org/en/latest/reference/unitofwork-associations.html

您的问题“如果其他方是编辑过的,则Doctrine不会自动保存拥有实体。”在那里也被记录为“仅对关联的反面进行的更改被忽略。”因此,您必须保持一致,并始终更新关系的拥有方。最好更新拥有方方法中的反面以保持同步。那就是..在PHP中同步你的对象,无论如何数据库只需要了解拥有方......