2017-05-30 51 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; 

}