2016-11-16 93 views
0

我是Sequelize的新人,我一直在浪费时间只是一个简单的查询。 sequelize的联合使我的头旋转@@。Sequelize JS - 如何使用复合键进行多重连接查询?

所以我想运行此查询

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'; 

我不知道如何实现sequelize格式的方式。 这里是我的模型:

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。尝试使用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 
}); 

希望这将帮助你!