2017-05-30 56 views
0

我有一个运行在nodejs中的Express应用程序,并使用Sequelize来处理MySQL数据库。在我的db逻辑中,我有从ChatRoomUserChatRoom的一对多关系。当我尝试大跳加入使用此代码:如何执行Sequelize加入

var userId = 1; 

db.ChatRoom.findAll({ include: [{ 
       model: db.UserChatRoom, 
       where: { 
        ucrIdChatUser:userId 
       }, 
       required: false 
      }]}) 

我得到的控制台上出现以下错误信息:

Unhandled rejection Error: UserChatRoom is not associated to ChatRoom! 
    at validateIncludedElement 

我想获得联接查询工作,并希望得到帮助。我试图在index.js末尾执行关联。此脚本在调用应用程序启动时从此文件夹中加载模型,并从Sequize网站获取。

注:UserChatRoom.ucrIdChatRoom是一个外键UserChat.idChatRoom

型号:

module.exports = function(sequelize, DataType){ 
    var ChatRoom = sequelize.define("ChatRoom",{ 
     idChatUser: { 
      type: DataType.INTEGER, 
      autoIncrement: true, 
      primaryKey: true 
     }, 
     crName: { 
      type: DataType.STRING, 
      allowNull: false 
     }, 
     crDateInserted: { 
      type: DataType.DATE 
     }, 
     crDateUpdated: { 
      type: DataType.DATE 
     }, 
     crIsOpen: { 
      type: DataType.INTEGER, 
      defaultValue: 0 
     } 

    }) 

    return ChatRoom; 

} 

module.exports = function(sequelize, DataType){ 
    var UserChatRoom = sequelize.define("UserChatRoom",{ 
     idUserChatUser: { 
      type: DataType.INTEGER, 
      autoIncrement: true, 
      primaryKey: true 
     }, 
     ucrIdChatUser: { 
      type: DataType.INTEGER 
     }, 
     ucrIdChatRoom: { 
      type: DataType.INTEGER 
     }, 
     ucrDateInserted: { 
      type: DataType.DATE 
     }, 
     ucrDateUpdated: { 
      type: DataType.DATE 
     } 

    }) 

    return UserChatRoom; 

} 

index.js

"use strict"; 

var fs  = require("fs"); 
var path  = require("path"); 
var Sequelize = require("sequelize"); 
var env  = process.env.NODE_ENV || "development"; 
var config = require(path.join(__dirname, '..', 'config', 'config.json'))[env]; 

if (process.env.DATABASE_URL) { 
    var sequelize = new Sequelize(process.env.DATABASE_URL,config); 
} else { 
    var sequelize = new Sequelize(config.database, config.username, config.password, config); 
} 

var db  = {}; 

fs 
    .readdirSync(__dirname) 
    .filter(function(file) { 
    return (file.indexOf(".") !== 0) && (file !== "index.js") && (file.slice(-3) === '.js'); 
    }) 
    .forEach(function(file) { 
    var model = sequelize.import(path.join(__dirname, file)); 
    db[model.name] = model; 
    }); 

Object.keys(db).forEach(function(modelName) { 
    if ("associate" in db[modelName]) { 
    db[modelName].associate(db); 
    } 
}); 

db.sequelize = sequelize; 
db.Sequelize = Sequelize; 

db.UserChatRoom.hasOne(db.ChatUser); 
db.UserChatRoom.hasOne(db.ChatRoom, { foreignKey: 'ucrIdChatRoom' , foreignKeyConstraint:true }); 

db.ChatUser.belongsTo(db.UserChatRoom, { foreignKey: 'ucrIdChatRoom' , foreignKeyConstraint:true}); 

db.ChatRoomMessage.hasOne(db.UserChatRoom, { foreignKey: 'crmIdUserChatRoom' , foreignKeyConstraint:true }); 

module.exports = db; 

回答

1

你必须定义关系两种方式。 UserChatRoom有一个ChatRoom,ChatRoom属于UserChatRoom。此外,您的关系应该放在每个模型中,而不是放在索引中。

module.exports = function(sequelize, DataType){ 
    var ChatRoom = sequelize.define("ChatRoom",{ 
     idChatUser: { 
      type: DataType.INTEGER, 
      autoIncrement: true, 
      primaryKey: true 
     }, 
     //etc 

    }, { 
     classMethods: { 
     //models/index.js calls this function 
     associate: function(models) { 
      ChatRoom.belongsTo(UserCharRoom, {foreignKey: 'something'}); 
     } 
     } 
    }) 

    return ChatRoom; 

}