別名「has one」
一対一の関連付けは、あるモデルが他のモデルと1つだけ関連付けられることを示します。モデルがどのモデルと関連付けられているかを知るためには、一方のレコードに外部キーを含め、さらにその外部キーにuniqueデータベース制約を設定する必要があります。
現在、Waterlineでこの関連付けを処理する方法は2つあります。
この例では、PetとUserを関連付けています。Userは1つのPetしか持てず、Petも1人のUserしか持てません。ただし、この例で両側からクエリを実行できるようにするには、Userモデルにcollection属性を追加する必要があります。これにより、User.find().populate('pet')とPet.find().populate('owner')の両方を呼び出すことができます。
2つのモデルは、Petモデルのowner属性を更新することで同期を保ちます。uniqueプロパティを追加することで、各ownerに1つの値だけがデータベースに存在するようにします。欠点は、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: 'number'
},
pet: {
collection:'pet',
via: 'owner'
}
}
}
この例では、PetとUserを関連付けています。Userは1つのPetしか持てず、Petも1人のUserしか持てません。ただし、両側からクエリを実行できるようにするには、Userモデルにmodelプロパティを追加します。これにより、User.find().populate('pet')とPet.find().populate('owner')の両方を呼び出すことができます。
2つのモデルは同期を保たないので、一方を更新するときは、もう一方も更新する必要があることに注意してください。
// 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: 'number'
},
pet: {
model:'pet'
}
}
}