我有一个实体,比如A。还有一个B。
A={id,name}B={id,details}
我想要一对一的关系。基本上,对于A中的每一个x,B中必须正好有一个y,反之亦然。所以我考虑了解决办法,并提出了以下建议。
一。id是共享的。
但基本上会是这样。
A={same_id,name} B={same_id,details} same_id is unique
B将有一个用于相同id到相同id的外键。
或者A将有一个外键用于相同的id到B。相同的id
但我想从A那里得到细节。
基本上是做$a->getAB()->getDetails();
这意味着我们需要实现2)。
但这听起来有违直觉,因为这意味着,必须首先创建一个新的B实体,然后创建一个a实体并将其指向B实体。
看起来B拥有A-而不是我想要的。
反过来说,如果B有一个外键给A,我还能告诉一个关于B的存在吗,这样我就可以做$-> GETABAF()-> GeDebug In();
2。B有另一个id,A有一个外键:
所以它会像:A={id,name,bId} B={bId,details} bId is unique, id is unique
但这样看来-我好像在浪费一篇专栏文章。
B不会知道它和A连在一起,也许这是一个坏习惯。
编辑:但这并不能解决任何问题,只是注意到我必须再次首先创建B,因为A中的任何x都需要指向B中的有效y。
三。自动生成映射有问题吗?
目前,我正在从MySQL数据库生成XML映射和实体类。
是不是这一代人不会自动告诉A B是否有外键?

最佳答案

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();

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

关于php - Doctrine2一对一正确完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32098308/

10-10 14:12