【问题标题】:Doctrine2 one-to-one correctly doneDoctrine2 一对一正确完成
【发布时间】:2015-08-19 14:26:55
【问题描述】:

我有一个实体,比如说 A。还有一个 B。

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

我想要一对一的关系。基本上,对于 A 中的每个 x,B 中必须恰好有一个 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 有外键?

【问题讨论】:

    标签: php mysql doctrine-orm


    【解决方案1】:

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

    同时创建两个Entities没有问题;

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

    再一次 - 必须有拥有方,并且您必须维护逻辑。

    【讨论】:

    • 谢谢,我已经阅读了所有相关信息,现在它可以工作了。但遗憾的是我遇到了另一个问题——反面总是自动加载,这很糟糕……我有什么补救措施吗?还是我根本不应该告诉对方这种关系?
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多