2016-04-27 5 views
3

Привет, я новичок в Sequelize, и я действительно потерял информацию о том, как управлять отношениями. Я хочу установить отношение 1: N, но когда я увижу результаты, я не получаю данные отношения. Я работаю с 2 столами в данный момент, medicos и hospitals, где hospitals может иметь много doctors, но doctors имеет только один hospital.Sequelize: Ошибка при попытке вставить ассоциацию

Это мой 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" 
     }) 
    } 
    } 
    }); 
}; 

Im управление мои модели с этим файлом 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

Вы должны определить свои отношения на обеих моделях. Также, когда вы используете attribTo, вы говорите, что врач относится к больнице, поэтому иностранный ключ определяется в докторе , внешний ключ в этом случае является идентификатором больницы. Но вы устанавливаете врача foreignKey как идентификатор больницы, который не будет работать.

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 работу. Вы должны вызвать функцию-ассоциированную функцию для каждой модели вручную. Существует стандартная реализация, которая предусматривает, что я модифицировал бит для работы с вашим кодом.

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

Большое вам спасибо, г-н Гримур Д. Вы мне очень помогли Ваш ответ правильный, мне просто нужно было добавить материал «Hospitals.hasMany (Доктора, {foreignKey:« idHospital »}) Врачи.принадлежит (Hospitals, {as: «Hospitals», foreignKey: «idHospital»}) 'Если я вас не беспокою, я бы хотел, если бы вы добавили к своему ответу, и, конечно же, вы получили щедрость. :) –

0

Пробовали ли вы это?

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

Для извлечения Médicos, а также:

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

Да, но я получаю эту ошибку Необработанного отказа SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Неизвестный столбец «doctors.hospitaleId» в «списке поля» в Query.formatError –

+0

Я думаю, это потому, что вам нужно определить отношения с «Больница» - «Доктор». В дальнейшем все отношения должны определяться в обоих направлениях. – Louy

Смежные вопросы