Doctrine - OneToOne单向与OneToOne双向

otp*_*ran 16 php orm doctrine relational-database doctrine-orm

我开始玩Doctrine ORM库,我正在学习表之间的所有关联.

所以我坚持单向和双向关系的差异.

我得到它,单向关系只在一侧有主键,而那边是拥有右侧的?并且双向关系在两个表中都有主键,因此您可以从两侧获得关系,并在两侧设置约束.

现在,我正在阅读关于关系的Doctrine文档,你有: 单向双向关联.

但它们生成相同的SQL,并且相同的表具有相同的主键和约束.所以我真的看不出这两者有什么不同.这两个例子都有主键.

当我得到真正的双向关系时,两个表中的主键应该指向另一个表吗?并且在Doctrine文档的给定示例中并非如此.两个例子都给出了相同的结果并且是相同的.

所以我做了,就是这样,假设我有用户和卡实体,并希望关系是OneToOne双向.

    /**
 * @Entity
 * @Table(name="users")
 */

class User
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="bigint")
     */
    protected $id;

    /**
     * @OneToOne(targetEntity="Card", mappedBy="User")
     * @JoinColumn(name="card_id", referencedColumnName="id")
     */
    protected $card;

    /**
     * @Column(name="user_name", type="string")
     */
    protected $userName;

    /**
     * @Column(name="user_pass", type="string")
     */
    protected $userPass;
}

    /**
 * @Entity
 * @Table(name="cards")
 */

class Card
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="bigint")
     */
    protected $id;

    /**
     * @OneToOne(targetEntity="User", inversedBy="Card")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

    /**
     * @Column(name="post_title", type="string")
     */
    protected $cardType;
}
Run Code Online (Sandbox Code Playgroud)

这里的区别是我在两个对象/实体中都写了@JoinColumn.在Doctrine示例中,只有一个.现在我会得到我认为的双向关系.如果我查看EER图,我可以看到一条线从用户到卡,另一条从卡到用户.

所以基本上我做对了吗?Doctrine文档是错的吗?:D如何在EER图中看到双向OneToOne关系?

谢谢!

rad*_*ovo 14

唯一的区别在于PHP类接口,即存在或不存在指向所有者的$customer属性(例如,在所提到的Doctrine示例中的属性).换句话说,Doctrine只需要知道它是应该关注单个property($shipping)还是两个属性($cart$customer).没有其他区别.因此,SQL代码是相同的(因为一个外键足以表示任何1:N关系)并且EER图也没有区别(因为在EER中,您通常不解决此类与PHP相关的实现细节).


Cri*_*iss 10

单向和双向与后台算法无关,如何在数据库层中创建这些连接.

他们所谈论的是如何使用连接.在单向关系中,您只能从一个站点访问目标.双向关系允许从两个(两个)侧调用连接.

所以在unidir.相对.model_a可以到达model_b,但是model_b无法进入model_a(没有额外的工作).如果你现在使用bidir.两个模型可以相互访问而不会出现问题

在学说术语中,单向关系定义$modelA->getModelB()方法,但不定义 $modelB->getModelA()方法,而双向关系定义两种方法(或访问者,但是要调用它们)

在uml图中,它看起来像这样:

unidirectional
modelA --X------> modelB

bidirectional
modelA <--------> modelB
Run Code Online (Sandbox Code Playgroud)