`.populate()`
実行時に指定されたコレクションの子レコードを(オプションで`subcriteria`でフィルタリングして) 読み込むように、クエリインスタンスを変更します。 各呼び出しが異なるアソシエーション用であれば、同じクエリに対して`populate`を複数回呼び出すことができます。
.populate(association, subcriteria)
引数 | 型 | 詳細 | |
---|---|---|---|
1 | association | 読み込むアソシエーションの名前。例: `snacks`。 | |
2 | subcriteria | オプション。同じデータベースにある2つのモデル間の`collection`アソシエーションを読み込む際に、Waterlineクエリ条件を`populate`の第2引数として指定できます。これは、各主レコードに関連付けられた関連レコード(例: snacks)の配列をフィルタリング、ソート、制限するために使用されます。 |
重要: 基本的な結合ポリフィル(クロスデータストアの読み込み、または設定されたアダプタが`.join()`実装を提供しないモデル間の読み込み)と、`.populate()`への`subcriteria`引数の両方がSailsで個別に完全にサポートされています。 しかし、`subcriteria`引数を`populate()`と一緒に結合ポリフィルと同時に使用することは実験段階です。 つまり、アソシエーションが複数のデータストアにまたがっている場合、またはそのデータストアの設定されたアダプタが物理レイヤー結合をサポートしていない場合は、`subcriteria`引数に依存しないでください。本番環境でこれを実行しようとすると、コンソールに警告がログ出力されます。sails-postgresqlやsails-mysqlなどのSQLアダプタはネイティブ結合をサポートしており、`subcriteria`引数の使用は問題ありません。
注意: `schema: false`を使用している場合、定義された属性のみが読み込まれます。
次の例では、データベースからFinnという名前のユーザーを検索し、それぞれについて父親の情報も読み込みます。
var usersNamedFinn = await User.find({name:'Finn'}).populate('dad');
sails.log('Wow, there are %d users named Finn.', usersNamedFinn.length);
sails.log('Check it out, some of them probably have a dad named Joshua or Martin:', usersNamedFinn);
return res.json(usersNamedFinn);
結果は次のようになります。
[
{
id: 7392,
age: 13,
name: 'Finn',
createdAt: 1451088000000,
updatedAt: 1545782400000,
dad: {
id: 108,
age: 47,
name: 'Joshua',
createdAt: 1072396800000,
updatedAt: 1356480000000,
dad: null
}
},
// ...more users
]
この例では、オプションの`subcriteria`引数を使用しています。
次の例では、データベースからFinnという名前のユーザーを検索し、それぞれについて、最もヒップな紫の剣3本をヒップさの降順で読み込みます。
// Warning: This is only safe to use on large datasets if both models are in the same database,
// and the adapter supports optimized populates.
// (e.g. cannot do this with the `User` model in PostgreSQL and the `Sword` model in MongoDB)
var usersNamedFinn = await User.find({ name:'Finn' })
.populate('currentSwords', {
where: {
color: 'purple'
},
limit: 3,
sort: 'hipness DESC'
});
// Note that Finns without any swords are still included -- their `currentSwords` arrays will just be empty.
sails.log('Wow, there are %d users named Finn.', usersNamedFinn.length);
sails.log('Check it out, some of them probably have non-empty arrays of purple swords:', usersNamedFinn);
return res.json(usersNamedFinn);
結果は次のようになります。
[
{
id: 7392,
age: 13,
name: 'Finn',
createdAt: 1451088000000,
updatedAt: 1545782400000,
dad: 108,//<< not populated
swords: [//<< populated
{
id: 9,
title: 'Grape Soda Sword',
color: 'purple',
createdAt: 1540944000000,
updatedAt: 1540944000000
},
// ...more swords
]
},
// ...more users
]