2016-11-16 215 views
0

私はSequelizeで新しく、単純なクエリで時間を無駄にしています。続編の会合が私の頭を揺らす@@。Sequelize JS - 複合キーで複数の結合クエリを実行する方法

だから、私はsequelize形式でその方法を実現する方法がわからないこのクエリ

SELECT a.first_name, a.last_name, b.host_id FROM RoomDetails a 
      LEFT JOIN Rooms b ON b.host_id = a.chat_id 
      LEFT JOIN States c ON c.id = b.state_id 
      WHERE c.bot='$bot_name' AND c.chat_id='$chatid'; 

を実行したいです。ここ は私のモデルです:

states.js

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var states = sequelize.define('states', { 
    botName: DataTypes.STRING, 
    chatId: DataTypes.INTEGER, 
    state: DataTypes.STRING, 
    turnId: DataTypes.INTEGER, 
    turnName: DataTypes.STRING 
    }, { 
    classMethods: { 
     associate: function(models) { 
     states.hasOne(models.rooms, { 
      as: 'rooms', 
      foreignKey: { 
      name: 'stateId' 
      }, 
      foreignKeyConstraint: true 
     }); 
     // associations can be defined here 
     } 
    } 
    }); 
    return states; 
}; 

rooms.js

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var rooms = sequelize.define('rooms', { 
    stateId: DataTypes.INTEGER, 
    hostId: DataTypes.INTEGER, 
    maxLetter: DataTypes.INTEGER 
    }, { 
    classMethods: { 
     associate: function(models) { 
     rooms.belongsTo(models.states, { 
      as: 'states', 
      foreignKey: { 
      name: 'stateId' 
      }, 
      foreignKeyConstraint: true 
     }); 
     rooms.hasMany(models.roomdetails, { 
      as: 'roomdetails', 
      foreignKey: { 
      name: 'roomId' 
      }, 
      foreignKeyConstraint: true 
     }); 
     rooms.belongsToMany(models.roomdetails, { 
      as: 'roomdetailschatid', 
      foreignKey: { 
      name: 'hostId' 
      }, 
      foreignKeyConstraint: true 
     }); 
     // associations can be defined here 
     } 
    } 
    }); 
    return rooms; 
}; 

roomdetails.js

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var roomdetails = sequelize.define('roomdetails', { 
    roomId: DataTypes.INTEGER, 
    chatId: DataTypes.INTEGER, 
    firstName: DataTypes.STRING, 
    lastName: DataTypes.STRING 
    }, { 
    classMethods: { 
     associate: function(models) { 
     roomdetails.belongsTo(models.rooms, { 
      as: 'rooms', 
      foreignKey: { 
      name: 'roomId' 
      }, 
      foreignKeyConstraint: true 
     }); 
     roomdetails.belongsTo(models.rooms, { 
      as: 'roomshostid', 
      foreignKey: { 
      name: 'chatId' 
      }, 
      foreignKeyConstraint: true 
     }); 
     // associations can be defined here 
     } 
    } 
    }); 
    return roomdetails; 
}; 
「フィールドリスト」で

これは私がこれまでに

module.exports.getHostInfo = function(res) { 
    return models.roomdetails.findOne({ 
     include: { 
      required: true, 
      model: models.rooms, 
      as: 'rooms', 
      include: { 
       required: true, 
       model: models.states, 
       as: 'states', 
       where: { 
        botName: { $eq: general.botName }, 
        chatId: { $eq: res.chat.id }, 
        state: { $ne: general.FINISHED} 
       } 
      } 
     } 
    }) 
    .then(function (response) { 
     console.log(response); 
     return response; 
    }) 
    .catch(function (error) { 
     console.log('error getTotalPlayer', error); 
    }); 
} 

をしようとしていたものであり、それは常に不明カラムのrooms.roomdetailId 'のようなエラーを返す

任意の体は私を助けることができますか? 助けていただきありがとうございます。ありがとうございます。

答えて

0

エラーとして、Sequelizeはsnake_caseを使用してデータベース列に保存されている間にcamelCaseで列を見つけることができません。 snake_caseを使ってforeignKeysを定義しようとしてください:

rooms.hasMany(models.roomdetails, { 
     as: 'roomdetails', 
     foreignKey: 'room_id', 
     foreignKeyConstraint: true 
    }); 
0

models/index.jsで関連付けを定義しましたか?

sequelize.roomDetails.belongsTo(sequelize.roome); 
sequelize.rooms.hasMany(sequelize.roomDetails, {as: 'roomDetails', foreignKey: 'room_id'}); 

以下のように定義していないなら、あなたはこれがお手伝いします

rooms.hasMany(models.roomdetails, { 
    as: 'roomdetails', 
    foreignKey: 'room_id', 
    foreignKeyConstraint: true 
}); 

希望を使用することができます!

関連する問題