2016-04-27 31 views
3

你好我是新的Sequelize,我真的失去了如何管理关系。我想设置1:N关系,但是当我看到结果时,我没有收到关系数据。我现在使用2个表格,medicoshospitals,其中hospitals可以有多个doctors,但doctors只有一个hospital续集:试图嵌套关联的错误

这是我doctors表:models/doctors.js

module.exports = function(sequelize, DataTypes) { 
     return sequelize.define('doctors', { 
     id: { 
      type: DataTypes.INTEGER(11), 
      allowNull: false, 
      primaryKey: true, 
      autoIncrement: true 
     }, 
     name: { 
      type: DataTypes.STRING, 
      allowNull: false 
     }, 
     lastName: { 
      type: DataTypes.STRING, 
      allowNull: false 
     }, 
     SSN: { 
      type: DataTypes.STRING, 
      allowNull: false 
     }, 
     speciality: { 
      type: DataTypes.ENUM('Doctor','Geriatrician'), 
      allowNull: false 
     }, 
     idHospital: { 
      type: DataTypes.INTEGER(11), 
      allowNull: false, 
     }, 
     }, { 
     tableName: 'doctors', 
     freezeTableName: true, 
     classMethods: { 
      associate: models => { 
      models.doctors.belongsTo(models.hospitals, { 
       foreignKey: "idHospital" 
      }) 
     } 
     } 
    }); 
     }); 
    }; 

而这一次hospitals之一:models/hospitals.js

module.exports = function(sequelize, DataTypes) { 
    return sequelize.define('hospitals', { 
    id: { 
     type: DataTypes.INTEGER(11), 
     allowNull: false, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    name: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    idData: { 
     type: DataTypes.INTEGER(11), 
     allowNull: false, 
     references: { 
     model: 'data', 
     key: 'id' 
     } 
    }, 
    }, { 
    tableName: 'hospitals', 
    freezeTableName: true, 
    classMethods: { 
     associate: models => { 
     models.hospitals.hasMany(models.doctors, { 
     foreignKey: "idHospital" 
     }) 
    } 
    } 
    }); 
}; 

进出口管理我的模型与此文件models/index.js

'使用严格的'

module.exports = (connection) => { 
    const Users      = connection.import('users'), 
     States     = connection.import('states'), 
     Cities     = connection.import('cities'), 
     Data      = connection.import('data'), 
     Patient     = connection.import('patients'), 
     Hospitals     = connection.import('hospitals'), 
     Doctors     = connection.import('doctors'), 


     Doctors.belongsTo(Hospitals) 
     Hospitals.hasMany(Doctors) 
     require('../controllers/patients')(Users) 
     require('../controllers/personal')(Doctors, Hospitals) 
} 

这个人是我的controller/controllers/personal.js

'use strict' 

module.exports = (Doctors) => { 

    const express = require('express'), 
     router = express.Router() 
    router 
    .get('/', (req, res) => { 
    Doctors.findAll({ include: [{ model: Hospitals, include: [Doctors], }], }).then((Doctors) => console.log(Doctors)); 
    }) 

和我的主要index

'use strict' 

const express  = require('express'), 
     path   = require('path'), 
     bodyParser = require('body-parser'), 
     Sequelize  = require('sequelize'), 
     port   = process.env.PORT || 3000, 
     app   = express(), 
     connection = new Sequelize('Matadero', 'root', 'root'); 

app.use(bodyParser.json()) 
app.use(bodyParser.urlencoded({extended:true})) 

app.set('view engine', 'ejs') 
app.set('views', path.resolve(__dirname, 'client', 'views')) 

app.use(express.static(path.resolve(__dirname, 'client'))) 

app.get('/', (req, res) => { 
    res.render('admin/index.ejs') 
}) 

const onListening =() => console.log(`Successful connection at port: ${port}`) 



require('./models')(connection) 

app.listen(port, onListening) 

const patients = require('./controllers/patients'), 
     personal = require('./controllers/personal') 


app.use('/api/patients', patients) 
app.use('/api/personal', personal) 

错误我越来越:Unhandled rejection Error: hospitals is not associated to doctors!

回答

1

你必须定义在这两种模式的关系。此外,当您使用belongsTo时,您说医生属于医院,因此外键在医生上定义,此例中的外键是医院的身份。但是,您将医生ForeignKey设置为不起作用的医院的ID。

module.exports = function(sequelize, DataTypes) { 
    var doctors = sequelize.define('doctors', { 
    id: { 
     type: DataTypes.INTEGER(11), 
     allowNull: false, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    name: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    lastName: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    SSN: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    idData: { 
     type: DataTypes.INTEGER(11), 
     allowNull: false, 
     references: { // I'd recommend using the associate functions instead of creating references on the property, only causes confusion from my experience. 
     model: 'data', 
     key: 'id' 
     } 
    }, 
    speciality: { 
     type: DataTypes.ENUM('Doctor','Geriatrician'), 
     allowNull: false 
    }, 
    // This is the foreignKey property which is referenced in the associate function on BOTH models. 
    idHospital: { 
     type: DataTypes.INTEGER(11), 
     allowNull: false // Using allowNull makes this relationship required, on your model, a doctor can't exist without a hospital. 
    }, 
    }, { 
    tableName: 'doctor', 
    freezeTableName: true, 
    classMethods: { 
     associate: models => { 
     doctors.belongsTo(models.hospitals, { 
      foreignKey: "idHospital" 
     }) 
     } 
    } 
    }); 

    return doctors; 
}; 

module.exports = function(sequelize, DataTypes) { 
    var hospital = sequelize.define('hospitals', { 
    id: { 
     type: DataTypes.INTEGER(11), 
     allowNull: false, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    name: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    idData: { 
     type: DataTypes.INTEGER(11), 
     allowNull: false, 
     references: { 
     model: 'data', 
     key: 'id' 
     } 
    }, 
    }, { 
    tableName: 'hospitals', 
    freezeTableName: true, 
    classMethods: { 
     associate: models => { 
      hospital.hasMany(models.doctors, { 
       foreignKey: 'idHospital' 
      } 
     } 
    } 
    }); 

    return hospital; 
}; 

UPDATE

您使用加载您的模型文件丢失了很多的是让sequelize工作所需的代码。您需要手动调用每个模型上的关联函数。有一个标准的实现,sequelize规定我修改了一下以处理你的代码。

var fs = require("fs"); 
var path = require("path"); 
var Sequelize = require("sequelize"); 

module.exports = (connection) => { 
    var models = {}; 

    // Here we read in all the model files in your models folder. 
    fs 
     // This assumes this file is in the same folder as all your 
     // models. Then you can simply do require('./modelfoldername') 
     // to get all your models. 
     .readdirSync(__dirname) 
     // We don't want to read this file if it's in the folder. This 
     // assumes it's called index.js and removes any files with  
     // that name from the array. 
     .filter(function (file) { 
      return (file.indexOf(".") !== 0) && (file !== "index.js"); 
     }) 
     // Go through each file and import it into sequelize. 
     .forEach(function (file) { 
      var model = connection.import(path.join(__dirname, file)); 
      models[model.name] = model; 
     }); 

    // For each model we run the associate function on it so that sequelize 
    // knows that they are associated. 
    Object.keys(models).forEach(function (modelName) { 
     if ("associate" in models[modelName]) { 
      models[modelName].associate(models); 
     } 
    }); 

    models.connection = connection; 
    models.Sequelize = Sequelize; 

    return models 
} 
+0

仍然无法正常工作。 :(我刚刚更新了我的代码,这是我得到的错误'未处理的拒绝错误:医院没有与医生联系!' –

+0

查看我的更新回答。 – grimurd

+1

非常感谢,GrimurD先生,你帮了我很多!您的回答是正确的,我只需要添加一些东西'Hospitals.hasMany(医生,{foreignKey:“idHospital”}) 医生。belongsTo(医院,{as:“Hospitals”,foreignKey:“idHospital”})'如果我没有打扰你,我想如果你加入你的答案,当然,你有奖金。 :) –

0

你试试这个?

Doctors.findAll({ include: Hospitals, }); 

为了获取医学生,以及:

Doctors.findAll({ include: [{ model: Hospitals, include: [Medicos], }], }); 
+0

是的,但我得到这个错误未处理拒绝SequelizeDatabaseError:ER_BAD_FIELD_ERROR:未知列“doctors.hospitaleId”在“字段列表” 在Query.formatError –

+0

我想这是因为你需要定义从关系'医院'到'医生'。在续集中,所有的关系都应该被定义为两种方式。 – Louy