一对一
概述
一对一表示的是一个模型只能和另一个模型关联。为了让一个模型知道它相关联的另外一个模型是什么,一个foreign的关键词必须包含在其中的一个记录里并且带有一个unique
数据库来约束它。
当前在Waterline中有两种方法来操作这种关联。
Has One Using A Collection
在这个例子中,我们关联一个Pet
和一个User
。User
只能有一只Pet
,反之亦然,一个Pet
只能有一个User
。然而,为了在这里中双方能够互相查询,我们必须添加一个collection
属性到User
模型中。这允许我们都可以调用User.find().populate('pet')和
Pet.find().populate('owner')`。
这两种方法通过更新Pet
模型的owner
属性来保持同步。添加unique
属性确保每一个owner
只有一个值存在于数据库中。当你从User
端populate出数据的视乎你将会得到一个数组。
// myApp/api/models/Pet.js
module.exports = {
attributes: {
name: {
type: 'string'
},
color: {
type: 'string'
},
owner:{
model:'user',
unique: true
}
}
}
// myApp/api/models/User.js
module.exports = {
attributes: {
name: {
type: 'string'
},
age: {
type: 'integer'
},
pet: {
collection:'pet',
via: 'owner'
}
}
}
Has One Manual Sync
在这个例子中,我们关联一个Pet
和一个User
。User
只能有一只Pet
,反之亦然,一个Pet
只能有一个User
。然而,为了在这里中双方能够互相查询,我们必须添加一个model
属性到User
模型中。这允许我们都可以调用User.find().populate('pet')和
Pet.find().populate('owner')`。
但是这两种模型将不会保持同步。所以当你更新其中一端的时候记得也去更新另外一端。
// myApp/api/models/Pet.js
module.exports = {
attributes: {
name: {
type: 'string'
},
color: {
type: 'string'
},
owner:{
model:'user'
}
}
}
// myApp/api/models/User.js
module.exports = {
attributes: {
name: {
type: 'string'
},
age: {
type: 'integer'
},
pet: {
model:'pet'
}
}
}
注意
关于更细节的描述请参考Waterline Docs。