我正在用sequelize ORM 开发一个sails.js应用程序.关于什么时候需要使用BelongsTo和HasOne,我有点困惑.
文件指出:
BelongsTo关联是源模型上存在一对一关系的外键的关联.
HasOne关联是目标模型上存在一对一关系的外键的关联.
除了指定这些之外还有其他区别吗?在任何一种情况下,这种行为是否仍然相同?
这是更普遍的问题.
主要区别在于语义.你必须决定什么是关系(一些愚蠢的例子):
男人只有一只右臂.右臂属于一个人.
说它反过来看起来有点奇怪:
右臂有一个男人.一个男人属于右臂.
你可以让男人没有右臂.但是单独的右臂是无用的.
在续集中如果RightArm和Men是模型,它可能看起来像:
Man.hasOne(RightArm); RightArm.belongsTo(Man);
正如您所注意到的,db表结构也存在差异:
BelongsTo将在源头上添加foreignKey,其中hasOne将在目标上添加(Sequelize在表'RightArm'中创建新列'ManId',但不在'Man'表中创建'RightArmId'列).
我没有看到任何更多的分歧.
我同意Krzysztof Sztompka关于以下两者之间的区别:
Man.hasOne(RightArm); RightArm.belongsTo(Man);
我想回答杨俊君的问题:
所以在这种情况下,我应该使用
Man.hasOne(RightArm);
或者RightArm.belongsTo(Man);
?或者两者兼用?
确实,Man.hasOne(RightArm);
关系和RightArm.belongsTo(Man);
一个人做同样的事情 - 这些关系中的每一个都会将外键添加manId
到RightArm
表中.
从物理数据库层的角度来看,这些方法做了同样的事情,对我们的数据库来说,我们将使用的确切方法没有区别.
那么,有什么区别?主要的区别奠定了ORM的层上(在我们的情况下,它是Sequalize ORM,但下面的逻辑也适用于Laravel的雄辩 ORM甚至Ruby的活动记录 ORM).
使用该Man.hasOne(RightArm);
关系,我们将能够RightArm
使用该Man
模型填充该人.如果这对我们的应用程序来说足够了,我们可以停止它并且不要将RightArm.belongsTo(Man);
关系添加到RightArm
模型中.
但是如果我们需要得到RightArm
主人呢?如果不在RightArm
模型上定义RightArm.belongsTo(Man);
关系,我们将无法使用模型执行此操作RightArm
.
还有一个例子是模型User
和Phone
模型.定义User.hasOne(Phone)
关系,我们将能够填充我们User
的Phone
.如果没有定义Phone.belongsTo(User)
关系,我们将无法填充我们Phone
的所有者(例如我们的User
).如果我们定义Phone.belongsTo(User)
关系,我们将能够得到我们Phone
的所有者.
所以,这里我们有一个主要区别:如果我们希望能够从两个模型填充数据,我们需要在它们两者上定义关系(hasOne
和belongsTo
).如果这是足以让我们只得到,例如,User
的Phone
,但不是Phone
的User
,我们只能定义User.hasOne(Phone)
在关系User
模型.
上面的逻辑适用于所有具有hasOne
和belongsTo
关系的ORM .
我希望这能澄清你的理解.