Я попытался связать 2 таблицы через новую, которую я уже создал в mySql.Тогда я могу получить необходимые данные из API.2 таблицы для связи с новой - это пользователь и страна.Пользователь может посетить многие страны.Страну могут посещать многие пользователи.
Вот моя модель User.js:
const Sequelize = require('sequelize')
const db = require('../database/db.js')
const Country = require('./Country')
const User = db.sequelize.define('user',
{
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: Sequelize.STRING
},
firstName: {
type: Sequelize.STRING
},
password: {
type: Sequelize.STRING
},
admin: {
type: Sequelize.TINYINT
}
},
{
freezeTableName: true,
timestamps: false,
});
User.associate = () => {
User.belongsToMany(Country, {
through: 'Country_user',
as: 'country',
foreignKey: 'id_user'
});
};
module.exports = User
Тогда вот моя модель Country.js:
const Sequelize = require('sequelize')
const db = require('../database/db.js')
const User = require('./User')
const Country = db.sequelize.define('country',
{
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
code: {
type: Sequelize.INTEGER
},
alpha2: {
type: Sequelize.STRING
},
alpha3: {
type: Sequelize.STRING
},
name_en: {
type: Sequelize.STRING
},
name_fr: {
type: Sequelize.STRING
}
},
{
freezeTableName: true,
timestamps: false
});
Country.associate = () => {
Country.belongsToMany(User, {
through: 'Country_user',
as: 'user',
foreignKey: 'id_country'
});
};
module.exports = Country;
Вот моя модель Country_user.js:
const Sequelize = require('sequelize')
const db = require('../database/db.js')
const Country_user = db.sequelize.define('country_user', {
id_user: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: 'User',
key: 'id'
}
},
id_country: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: 'Country',
key: 'id'
}
}
});
module.exports = Country_user
И, наконец, вот мой запрос для получения данных, которые мне нужны:
var express = require('express')
var router = express.Router()
const User = require('../../models/User')
const Country = require('../../models/Country')
router.get('/user', function(req, res, next){
User.findAll({
include: [{
model: Country,
as: 'country',
attributes: ['id', 'name_fr'],
through: { attributes: [] }
}]
})
.then(user => {
res.json(user)
})
.catch(err => {
res.send('error: ' + err)
})
})
module.exports = router
Я бы хотел, чтобы ORM не создавал новыеполя в базе данных.Я уже создал их.Я просто хочу связать эти внешние ключи с правой таблицей в ORM, чтобы я мог легко получить свои данные.
Когда я пытался использовать маршрут / пользователя, я получаю это от POSTMAN:
ошибка: SequelizeEagerLoadingError: страна не связана с пользователем!
Редактировать: Файл db.js построен так:
const Sequelize = require('sequelize')
const db = {}
const sequelize = new Sequelize('travel_memories', 'root', '', {
host: 'localhost',
dialect: 'mysql',
port: 3306
})
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
db.sequelize = sequelize
db.Sequelize = Sequelize
module.exports = db