BelongToMany с таблицей Sequelize не связан - PullRequest
0 голосов
/ 03 июня 2019

Я попытался связать 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

Ответы [ 3 ]

0 голосов
/ 25 июня 2019
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);
  });

const models = {
  Country: sequelize.import('../../models/Country'),
  User: sequelize.import('../../models/User'),
  CountryUserJoin: sequelize.import('../../models/Country_user')      
};

Object.keys(models).forEach((modelName) => {
  if ('associate' in models[modelName]) {
// console.log(models[modelName]);
models[modelName].associate(models);
  }
});

db.sequelize = sequelize
db.Sequelize = Sequelize

module.exports = db
0 голосов
/ 28 июня 2019

Вот как я написал мой собственный JS-файл:

module.exports = function (sequelize, DataTypes) {
  const Country = sequelize.define('loc_countries', {
    id: {
      type: DataTypes.BIGINT,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
    },
    name: {
      type: DataTypes.STRING,
      allowNull: true,
    },
    abbr2: {
      type: DataTypes.STRING,
      allowNull: true,
    },
    abbr3: {
      type: DataTypes.STRING,
      allowNull: true,
    },
  }, {
    freezeTableName: true,
    timestamps: false,
    tableName: 'loc_countries',
  });

  Country.associate = function (models) {
    models.Country.hasMany(models.ProvinceState, { as: 'ProvStates', foreignKey: 'loc_countries_id' });
  };

  return Country;
};
0 голосов
/ 05 июня 2019

Вы пробовали свои модели через что-то подобное?

Object.keys(models).forEach((modelName) => {
  if ('associate' in models[modelName]) {
    // console.log(models[modelName]);
    models[modelName].associate(models);
  }
});

На самом деле создать ассоциации? Недостаточно просто добавить логику ассоциации ownToMany в страну и пользователя

У меня в каталоге моделей есть индексный файл, который делает что-то вроде этого, я немного его модифицирую, вам нужно заменить операторы "path_to" на любой ваш правильный путь ....

import { Sequelize } from 'sequelize';
import sequelize from '../../helpers/db';

const models = {
  Country: sequelize.import('./path_to_country'),
  User: sequelize.import('./path_to_user'),
  CountryUserJoin: sequelize.import('./path_to_join')      
};

Object.keys(models).forEach((modelName) => {
  if ('associate' in models[modelName]) {
    // console.log(models[modelName]);
    models[modelName].associate(models);
  }
});

models.sequelize = sequelize;
models.Sequelize = Sequelize;

export default models;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...