Sequelize. js ассоциации моделей - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь создать приложение-клон Tinder, в котором у меня есть два разных типа пользователей: player и trainer, где они могут совпадать. Я просматривал документы, пытаясь понять, какие ассоциации нужно реализовать между таблицей matches и таблицами messages, где запись совпадения имеет playerId и trainerId, то же самое относится к сообщениям.

Мой вопрос:

как мне это реализовать и когда применять ассоциации ownTo, hasMany, ownToMany?

это то, что я сделал до сих пор:

players.model.js

players.associate = function (models) {
  players.hasMany(models.messages);
  players.hasMany(models.matches);
};
trainers.model.js

teachers.associate = function (models) {
  trainers.hasMany(models.messages);
  trainers.hasMany(models.matches);
};
messages.model.js

messages.associate = function (models) {
  messages.belongsTo(models.players);
  messages.belongsTo(models.trainers);
  messages.belongsTo(models.matches);
};
matches.model.js

matches.associate = function (models) {
  matches.belongsTo(models.players);
  matches.belongsTo(models.trainers);
  matches.hasMany(models.messages);
};

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете зарегистрировать все модели и после этого все их ассоциации следующим образом:

var fs = require('fs')
var path = require('path')
var basename = path.basename(module.filename)
var db = {}
var models = path.join(__dirname, 'models')

fs.readdirSync(models)
  .filter(function(file) {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js')
  })
  .forEach(function(file) {
    var model = sequelize['import'](path.join(models, file))
    db[model.name] = model
  })

Object.keys(db).forEach(function(modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db)
  }
})

Затем вы можете экспортировать db объект, чтобы использовать все модели для запроса данных

Например получить все матчи с тренером и игрок включает в качестве объектов:

const allMatches = db.matches.findAll({
  include: [db.trainers, db.players]
})
...