2017-05-30 2 views
0

Ich habe eine Express-App in Nodejs ausgeführt und verwendet Sequelize, um mit einer MySQL-Datenbank zu arbeiten. In meiner Db-Logik habe ich eine 1: n-Beziehung von ChatRoom zu UserChatRoom. Wenn ich versuche, eine Preform verbinden mit diesem Code:So führen Sie Sequelize Join

var userId = 1; 

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

ich die folgende Fehlermeldung auf der Konsole:

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

Ich möchte die Abfrage Arbeits beitreten bekommen und Hilfe schätzen würde. Ich habe versucht, Verbände am Ende index.js zu erzwingen. Dieses Skript lädt die Modelle in diesem Ordner, wenn die App gestartet wird und von der Sequlize-Website stammt.

Hinweis: UserChatRoom.ucrIdChatRoom ist ein Fremdschlüssel zu UserChat.idChatRoom

Modelle:

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; 

} 

und

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; 

Antwort

1

Sie müssen die Beziehung in beide Richtungen definieren. UserChatRoom hat einen ChatRoom, ChatRoom gehört zu UserChatRoom. Außerdem sollten Ihre Beziehungen in jedem Modell und nicht in Ihrem Index platziert werden.

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; 

} 
Verwandte Themen