当前位置:  开发笔记 > 编程语言 > 正文

Sequelize ORM中HasOne与BelongsTo的区别

如何解决《SequelizeORM中HasOne与BelongsTo的区别》经验,为你挑选了2个好方法。

我正在用sequelize ORM 开发一个sails.js应用程序.关于什么时候需要使用BelongsTo和HasOne,我有点困惑.

文件指出:

BelongsTo关联是源模型上存在一对一关系的外键的关联.

HasOne关联是目标模型上存在一对一关系的外键的关联.

除了指定这些之外还有其他区别吗?在任何一种情况下,这种行为是否仍然相同?



1> Krzysztof Sz..:

这是更普遍的问题.

主要区别在于语义.你必须决定什么是关系(一些愚蠢的例子):

男人只有一只右臂.右臂属于一个人.

说它反过来看起来有点奇怪:

右臂有一个男人.一个男人属于右臂.

你可以让男人没有右臂.但是单独的右臂是无用的.

在续集中如果RightArm和Men是模型,它可能看起来像:

Man.hasOne(RightArm);
RightArm.belongsTo(Man);

正如您所注意到的,db表结构也存在差异:

BelongsTo将在源头上添加foreignKey,其中hasOne将在目标上添加(Sequelize在表'RightArm'中创建新列'ManId',但不在'Man'表中创建'RightArmId'列).

我没有看到任何更多的分歧.


在大多数情况下,我会同时使用它们
所以在这种情况下,我应该使用`Man.hasOne(RightArm);`还是`RightArm.belongsTo(Man);`?还是两者都使用?

2> Vladyslav Tu..:

我同意Krzysztof Sztompka关于以下两者之间的区别:

Man.hasOne(RightArm);
RightArm.belongsTo(Man);

我想回答杨俊君的问题:

所以在这种情况下,我应该使用Man.hasOne(RightArm);或者 RightArm.belongsTo(Man);?或者两者兼用?

确实,Man.hasOne(RightArm);关系和RightArm.belongsTo(Man);一个人做同样的事情 - 这些关系中的每一个都会将外键添加manIdRightArm表中.

从物理数据库层的角度来看,这些方法做了同样的事情,对我们的数据库来说,我们将使用的确切方法没有区别.

那么,有什么区别?主要的区别奠定了ORM的层上(在我们的情况下,它是Sequalize ORM,但下面的逻辑也适用于Laravel的雄辩 ORM甚至Ruby的活动记录 ORM).

使用该Man.hasOne(RightArm);关系,我们将能够RightArm使用该Man模型填充该人.如果这对我们的应用程序来说足够了,我们可以停止它并且不要将RightArm.belongsTo(Man);关系添加到RightArm模型中.

但是如果我们需要得到RightArm主人呢?如果不在RightArm模型上定义RightArm.belongsTo(Man);关系,我们将无法使用模型执行此操作RightArm.

还有一个例子是模型UserPhone模型.定义User.hasOne(Phone)关系,我们将能够填充我们UserPhone.如果没有定义Phone.belongsTo(User)关系,我们将无法填充我们Phone的所有者(例如我们的User).如果我们定义Phone.belongsTo(User)关系,我们将能够得到我们Phone的所有者.

所以,这里我们有一个主要区别:如果我们希望能够从两个模型填充数据,我们需要在它们两者上定义关系(hasOnebelongsTo).如果这是足以让我们只得到,例如,UserPhone,但不是PhoneUser,我们只能定义User.hasOne(Phone)在关系User模型.

上面的逻辑适用于所有具有hasOnebelongsTo关系的ORM .

我希望这能澄清你的理解.


很好的解释,非常感谢.
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有