ここに私のモデルがあります:
ユーザー
グループ
コメント
Users.hasMany(Groups, {foreignKey: 'userID', joinTableName: 'user_has_groups'});
Comments.hasMany(Users, {foreignKey: 'groupID', joinTableName: 'user_has_groups'});
Users.hasMany(Comments);
Comments.belongsTo(Users);
基本的に、ユーザーとグループは n:m テーブル (user_has_groups) にあり、そこでユーザー ID とグループ ID をリンクします。ユーザーは多くのグループを持つことができ、グループは多くのユーザーを持つことができます。
2 番目の部分は、ユーザーをコメントにリンクすることです。ユーザーは多くのコメントを持つことができ、コメントはユーザーに属します。
ここで、各ユーザーのグループを表示したい場合は、次のようにします。
Users.findAll({ include : [ Groups ] }).success( function(result) {
res.json(result);
});
意図したとおり、次のような結果を送信します。
{
"id": 1,
"name": "Ken",
"groups": [{
"id": 1,
"label": "Administrators"
}, {
"id": 2,
"label": "Contributors"
}]
}, {
"id": 2,
"name": "Barbie",
"groups": [{
"id": 2,
"label": "Contributors"
}, {
"id": 3,
"label": "Readers"
}]
}
コメントだけを含める場合も同様です。
Users.findAll({ include : [ Comments ] }).success( function(result) {
res.json(result);
});
ここには表示されませんが、信頼してください。結果は問題ありません。
ここで、グループとコメントの両方を含めたい場合、sequelize はデカルト積の処理方法を知りません。次のように表示されます。
Users.findAll({ include : [ Groups, Comments ] }).success( function(result) {
res.json(result);
});
{
"id": 1,
"name": "Ken",
"groups": [{
"id": 1,
"label": "Administrators"
}, {
"id": 2,
"label": "Contributors"
}, {
"id": 1,
"label": "Administrators"
}],
"comments":[{
"id": 1,
"text": "First! lol"
}]
}, {
"id": 2,
"name": "Barbie",
"groups": [{
"id": 2,
"label": "Contributors"
}, {
"id": 3,
"label": "Readers"
},{
"id": 2,
"label": "Contributors"
}, {
"id": 3,
"label": "Readers"
}],
"comments":[{
"id": 2,
"text": "Hey Ken!"
},{
"id": 3,
"text": "Why don't you answer!?"
},{
"id": 3,
"text": "Why don't you answer!?"
}]
}
それで... 他の誰かがすでにこの状況に直面しているのだろうか、それともあなたならどうしますか?
同じ結果でユーザーからグループとコメントの両方を取得したいと本当に思っています。シークェアライズの熱心な読み込みを介してできない場合は、生のクエリを実行します...
ありがとう!
回避策
これはうまくいくようです(+選択した回答のリンクを確認してください):
Users.find(id).success(function(user){
Groups.findAll({ where:{ userID:user.id }}).success(function(groups){
Comments.findAll({ where:{ userID:user.id }}).success(function(comments){
res.json({
id: user.id,
name: user.name,
groups: groups,
comments: comments,
})
})
})
})