string
やnumber
のラテラル型であることに加え、Seilsモデル内の属性は、データストア内の他のレコードへのリンクを表すことができます。このタイプの属性は アソシエーション と呼ばれます。たとえば、User
モデルとPet
モデルがあると、User
には、特定のユーザーを1つ以上のペットにリンクするpets
属性が含まれている場合があります。
リンクのタイプによっては、アソシエーション属性は、.create()
または.update()
呼び出しで、別のレコードの主キーの値を指定するか、.addToCollection
、.removeFromCollection()
、または.replaceCollection()
などの特別なモデルメソッドを使用して設定できます。
通常の属性とは異なり、アソシエーション属性の値は、.find()
または.findOne()
を使用してレコードを取得しても、常に返されるわけではありません。代わりに、.populate()
メソッドを使用して、取得するアソシエーションを宣言します。
// Find a single user, including its pets
var userWithPets = await User.findOne(123).populate('pets');
取得したレコードでアソシエーション属性がどのように表現されるかは、アソシエーションのタイプ、実際にリンクされたレコードがあるかどうか、クエリに.populate()
がチェーンされているかどうかによって異なります。アソシエーション属性を備えた取得したレコードの内容について詳しくは、こちらの表をご覧ください。
SeilsとWaterlineを使用すると、複数のデータストア間でモデルを関連付けることができます。つまり、ユーザーがPostgreSQLに存在し、コメントがMongoDBに存在する場合でも、それらが同じデータベースに一緒に存在するかのようにデータを操作できます。また、同じアダプターを使用して、異なるデータストアにまたがるアソシエーションを持つこともできます。これは、たとえば、アプリが、会社のデータセンター内のMySQLデータベースに保存された古いレシピデータにアクセスして更新する必要があるが、同時に、クラウド内の最新のMySQLデータベースから材料データを保存して取得する必要がある場合に便利です。
重要な注意
チュートリアルやコードのサンプルでは、アソシエーションの
collection
、model
、またはthrough
プロパティが小文字(ID)または大文字(グローバルID)でモデルを参照している場合があります。たとえば、次のアソシエーションでは、collection
プロパティはproduct
(Product
という名前のSeilsモデルのID)に設定されています。wishlist: { collection: 'product', via: 'wishlistedBy' }
Seilsドキュメントでは、一貫性のために常にグローバルIDのアプローチを使用しています。ただし、どちらのアプローチも機能することに注意してください。