別名「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'
}
}
}