1

以下は私のデータモデルです、

学校:

  • 学校ID
  • 名前
  • 状態

ゲーム:

  • 学校ID
  • ゲームID
  • 名前
  • 状態

参加者:

  • 学校ID
  • ゲームID
  • 学生証
  • 名前
  • 状態

「参加者」「学校」「ゲーム」の「ステータス」から「参加者」を表示したい。検索中に結果をフィルタリングすることは可能ですか?

実行したいクエリは、

select *
from
    Participants
    inner join Game on Participants.GameID = Game.GameID
    inner join School on Game.SchoolID = School.SchoolID
where
    Participants.Status="Active"
    and Game.Status="Active"
    and School.Status="Active"

Sailsjsモデルの関連付けを使用してそれを達成するにはどうすればよいですか?

4

1 に答える 1

0

Sails.js/Waterline には、深くネストされた関連付けを設定する組み込みの方法はまだありません。

次のようなモデルを設定する必要があります。

ゲーム:

attributes:{
    SchoolID:{
        model: 'School'
    }
    // rest of attributes
}

参加者:

attributes:{
    SchoolID:{
        model: 'School'
    },
    GameID:{
        model: 'Game'
    }
    // rest of attributes
}

クエリより:

Game.find({Status:"Active"})
    .populate("School",{
        where: {
            Status: "Active"
        }
    })
    .populate("Participants",{
        where: {
            Status: "Active"
        }
    }).exec(function (err, result){
        return result
    });

そして今、それはトリッキーな部分です。アクティブなゲームで配列を取得します。アクティブな学校や参加者がいるかどうかは関係ありません。その結果、参加者と学校の 2 つのサブ配列ができます。それらが空でない場合、それはあなたの結果です。

[
    {
        SchoolID: [],
        GameID: [],
        Name: '',
        Status: ''
    },
    {
        SchoolID: [SchoolID: 1, Name: '', Status: 'Active'],
        GameID: [SchoolID: 1, GameID: 1, Name: '', Status: 'Active'],
        Name: '',
        Status: ''
    }
]

lodash フィルターを使用して結果をクリーンアップできます。

はるかに簡単な2番目の解決策は、.query()を使用することです

作成したクエリをそのまま使用できます。

School.query('select * from Participants inner join Game on Participants.GameID=Game.GameID inner join School on Game.SchoolID=School.SchoolID where Participants.Status="Active" and Game.Status="Active" and School.Status="Active"', function(err, results) {

    return results;
});
于 2016-04-12T08:51:40.703 に答える