【问题标题】:Sequelize JS - How to do multiple join query with composite key?Sequelize JS - 如何使用复合键进行多连接查询?
【发布时间】:2017-03-30 09:49:57
【问题描述】:

我是 Sequelize 的新手,我一直在浪费时间进行简单的查询。 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';

我不知道如何以 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);
    });
}

它总是返回类似 'field list' 中的未知列 'rooms.roomdetailId' 的错误

任何机构可以帮助我? 任何帮助将不胜感激,谢谢

【问题讨论】:

    标签: mysql node.js orm associations sequelize.js


    【解决方案1】:

    正如错误所说,Sequelize 找不到带有 camelCase 的列,而在数据库中的列是使用蛇形大小写保存的。尝试使用snake_case定义foreignKeys:

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

    【讨论】:

      【解决方案2】:

      您是否在 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
      });
      

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 1970-01-01
        • 2017-08-06
        • 2021-09-23
        • 1970-01-01
        • 2017-01-27
        相关资源
        最近更新 更多