1

ここに私のモデルがあります:
ユーザー
グループ
コメント

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,
            })
        })
    })
})
4

1 に答える 1