Sequelize ассоциации между двумя таблицами - PullRequest
0 голосов
/ 16 апреля 2020

Я довольно новичок в этом (используя sequelize), и все для меня ново. Дело в том, что я могу создавать и получать пользователей через мой «users.model. js», но теперь я хочу создать модель с именем «data.model. js», чтобы связать некоторые данные с определенным пользователем.

Таким образом, в соответствии с документами по sequelize, мои ассоциации должны быть следующими:

Users.hasMany(Data)
Data.belongsTo(Users)

Но когда sequelize создает мои таблицы, у меня нет внешнего ключа в моей таблице данных.

Я поделюсь с вами своим кодом:

файл конфигурации (config. js):

const Sequelize = require('sequelize');

const connection = new Sequelize('drglicemia', 'root', '', {
host: 'localhost',
dialect: 'mysql'
});

module.exports = connection;

data.model. js:

const sequelize = require('sequelize');
const db = require('../config/database');
const usersTable = require('./users.model')

let Data = db.define('tabeladados', {
    dta: { type: sequelize.DATEONLY },
    hora: { type: sequelize.DATE },
    indiceglicemia: { type: sequelize.STRING },
    insulina: { type: sequelize.STRING },
    medicacao: { type: sequelize.STRING },
}, {
    timeStamps: false, tableName: 'tabeladados'
});

//associates the dataTable table with the users
Data.associate = () => {
    Data.belongsTo(usersTable)
}


module.exports = Data;

users.model. js:

const sequelize = require('sequelize');
const promise = require('bluebird')
const bcrypt = promise.promisifyAll(require('bcrypt'))
const db = require('../config/database');
const dataTable = require('./data.model')

let Users = db.define('utilizadores', {
    username: { type: sequelize.STRING },
    email: { type: sequelize.STRING },
    password: { type: sequelize.STRING },
}, {
    timeStamps: false, tableName: 'utilizadores',
});


//encrypts the password before submiting to the database
Users.beforeCreate((user, options) => {

    return bcrypt.hash(user.password, 10)
        .then(hash => {
            user.password = hash;
        })
        .catch(err => {
            throw new Error();
        });
});

//validates the password submited by the user with the one encrypted in the database
Users.prototype.validPassword = async (password) => {
    return await bcrypt.compare(password, this.password);
}

//associates the users table with the dataTable
Users.associate = () => {
    Users.hasMany(dataTable)
}

module.exports = Users;

Я считаю, что когда я пытаюсь связать свои таблицы, я делаю что-то не так, потому что чувствую, что делаю это неправильно.

Не знаю, но все работает, кроме этого.

Но это похоже на то, что я сказал в начале, я новичок в сиквелизе xD

1 Ответ

0 голосов
/ 17 апреля 2020

Я думаю, что причина в циклической ссылке . user.model.js требует data.model.js, а data.model.js требует user.model.js.

Вам необходимо создать файл index.js. Требуйте и сделайте ассоциации для всех моделей здесь, затем реэкспортируйте их. Например:

./models/index.js:

const User = require('./user.model.js');
const Data = require('./data.model.js');

User.hasMany(Data);
Data.belongsTo(User);

module.exports = {User, Data}

service.js или controller.js:

const models = require('./models/index.js');
// use models
await models.User.findAll();

Удалите приведенные ниже коды в файле модели:

// Remove from user.model.js file
Users.associate = () => {
    Users.hasMany(dataTable)
}
// Remove from data.model.js file
Data.associate = () => {
    Data.belongsTo(usersTable)
}
...