Doctrine2一对一正确完成

时间:2015-08-19 14:26:55

标签: php mysql doctrine-orm

我有一个实体,比如A.和另一个B。

A = {id,name} B = {id,details}

我想要一对一的关系。基本上对于来自A的每个x,必须恰好有一个来自B的y和相反的y。所以我考虑了解决方案并想出了以下内容。

1。 id是共享的。

但基本上它会是这样的。 A={same_id,name} B={same_id,details} same_id is unique

  • B将具有same_id到A.same_id的外键。
  • 或者A将具有same_id到B.same_id
  • 的外键

但我希望能够从A中获取详细信息。 基本上做$ a-> getAB() - > getDetails(); 这意味着我们需要实施2)。

但这听起来违反直觉,因为这意味着,必须首先创建一个新的B实体,然后创建一个A实体并将其指向B实体。

看起来B拥有A - 并不是我想要的。

反过来 - 如果B有A的外键,我还能告诉A关于B的存在吗,所以我可以做$ a-> getAB() - > getDetails();吗

2。 B有另一个id,A有一个外键:

所以它会像:A={id,name,bId} B={bId,details} bId is unique, id is unique

但是就这样 - 似乎我在为A浪费一个专栏。 B也不会知道它也附属于A,这也许是一种不好的做法。

编辑:但这并没有解决任何问题,只是注意到我必须再次创建B,因为来自A的任何x需要指向来自B的有效y。

3。关于自动生成映射的问题是什么?

目前,我正从MySQL数据库生成XML映射和实体类。

可能是这一代人不会自动告诉A B是否有外键吗?

1 个答案:

答案 0 :(得分:1)

One-To-One, Bidirectional association正是您所寻找的(类似于您在第2点中的示例) 是的 - 拥有很重要。另请阅读owning and inverse sides of associations的概念 我会说你的例子中A是拥有者 - 它有一个名字。名称通常比细节更重要。

同时创建两个实体没有问题;

$a = new A();
$a->setName("Alpha");

$b = new B();
$b->setDetails("Alpha goes first");

$a->setB($b);
$em->persist($a)->flush();

并且两个实体都会知道对方:

$a->getB();
$b->getA();

再次 - 必须有一个拥有的一方,你必须保持逻辑。