Представление таблицы ассоциации, связывающей две модели - PullRequest
0 голосов
/ 04 июня 2019

Я новичок во вселенной NodeJ и использую Sequelize с PostgreSQL для проекта ExpressJs. У меня возникли некоторые проблемы с поиском правильного способа представления таблицы связи между двумя моделями. Вот мои две таблицы:

'игроки':

  • ID
  • 1008 * Firstname *
  • 1010 * Фамилия *
  • year_of_birth
  • навыки
  • Войти
  • пароль
  • created_at
  • updated_at

'команды':

  • ID
  • имя
  • created_at
  • updated_at

И таблица ассоциации 'team_players':

  • ID
  • id_team
  • id_player

Приведя несколько примеров в интернете, я попробовал следующий синтаксис:

Player.belongsToMany(Team, {foreignKey: 'id_player', through: 'team_players'});

Когда я пытаюсь получить доступ к данным через эту ассоциацию следующим образом:

Player.findAll({ include :[{model: Team,foreignKey: 'id_team', through: 'team_players'}] })
. then(results)[...]

Не работает.

Вот определения моделей, которые я сделал.

Определение модели плеера:

const { Sequelize } = require('../config/postgres');
const { sequelizeInstance } = require('../config/postgres');

const { Model } = Sequelize;
const Team = require('./Team');

class Player extends Model {}
Player.init({
  firstname: {
    type: Sequelize.STRING,
    allowNull: false,
    validate: {isAlpha: true}
  },
  lastname: {
    type: Sequelize.STRING,
    allowNull: false,
    validate: {isAlpha: true}
  },
  year_of_birth: {
    type: Sequelize.INTEGER,
    allowNull: false,
    validate: {
      min: 1950,
      max: 2019,
      isNumeric: true
    },
  },
  skills: {
    type: Sequelize.INTEGER,
    allowNull: false,
    validate: {isInt: true}
  },
  login: {
    type: Sequelize.STRING,
    allowNull: false,
    validate: 
    {
      isAlphanumeric: true,
      unique: true
    }
  },
  password: {
    type: Sequelize.STRING,
    allowNull: false,
    validate: {isAlphanumeric: true}
  },
},
{
  sequelize: sequelizeInstance,
  timestamps: true,
  modelName: 'player',
  tableName: 'players'
});

Player.belongsToMany(Team, {foreignKey: 'id_player', through: 'team_players'});

module.exports = Player;

Определение модели команды:

const { Sequelize } = require('../config/postgres');
const { sequelizeInstance } = require('../config/postgres');

const { Model } = Sequelize;
const Player = require('./Player');

class Team extends Model {}
Team.init({
  name: {
    type: Sequelize.STRING,
    allowNull: false,
    unique: true
  },
},
{
  sequelize: sequelizeInstance,
  timestamps: true,
  modelName: 'team',
  tableName: 'teams'
});

module.exports = Team;

Вот сообщение об ошибке:

  name: 'SequelizeDatabaseError',
  parent:
   { error: column teams->team_players.teamId does not exist
       at Connection.parseE (/home/nku/sources/.perso/pasanga/server/node_modules/pg/lib/connection.js:602:11)
       at Connection.parseMessage (/home/nku/sources/.perso/pasanga/server/node_modules/pg/lib/connection.js:399:19)
       at Socket.<anonymous> (/home/nku/sources/.perso/pasanga/server/node_modules/pg/lib/connection.js:121:22)
       at Socket.emit (events.js:197:13)
       at addChunk (_stream_readable.js:288:12)
       at readableAddChunk (_stream_readable.js:269:11)
       at Socket.Readable.push (_stream_readable.js:224:10)
       at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:150:17)
     name: 'error',
     length: 125,
     severity: 'ERROR',
     code: '42703',
     detail: undefined,
     hint: undefined,
     position: '776',
     internalPosition: undefined,
     internalQuery: undefined,
     where: undefined,
     schema: undefined,
     table: undefined,
     column: undefined,
     dataType: undefined,
     constraint: undefined,
     file: 'parse_relation.c',
     line: '3293',
     routine: 'errorMissingColumn',
     sql:
      'SELECT "player"."id", "player"."firstname", "player"."lastname", "player"."yob", "player"."skills", "player"."login", "player"."password", "player"."created_at", "player"."updated_at", "teams"."id" AS "teams.id", "teams"."name" AS "teams.name", "teams"."created_at" AS "teams.created_at", "teams"."updated_at" AS "teams.updated_at", "teams->team_players"."created_at" AS "teams.team_players.created_at", "teams->team_players"."updated_at" AS "teams.team_players.updated_at", "teams->team_players"."id_player" AS "teams.team_players.id_player", "teams->team_players"."teamId" AS "teams.team_players.teamId" FROM "players" AS "player" LEFT OUTER JOIN ( "team_players" AS "teams->team_players" INNER JOIN "teams" AS "teams" ON "teams"."id" = "teams->team_players"."teamId") ON "player"."id" = "teams->team_players"."id_player";' }

1 Ответ

0 голосов
/ 04 июня 2019

Ваша связь между игроками в команде в порядке.Я думаю, что вы могли бы решить эту проблему, переименовав team_players.id_team в имя по умолчанию team_players.teamId

Или вы можете добавить ассоциацию из Team-to-Players для обработки выбранного вами внешнего ключа, напримерэто:

Team.belongsToMany (Player,{foreignKey: 'id_team', through: 'team_players'});

Отредактировано 5 июня

Вот рабочий код:

const Sequelize = require('sequelize');
const node_app_name = require("../sqltest");  // my db instance here
const { Model } = Sequelize;

class Player extends Model {}
Player.init({
  firstname: Sequelize.STRING,
  lastname: Sequelize.STRING,
},
{sequelize: node_app_name.sequelizeDB});

class Team extends Model {}
Team.init({
  name: Sequelize.STRING
},
{sequelize: node_app_name.sequelizeDB});

class TeamPlayer extends Model {}
TeamPlayer.init({
    id_team: Sequelize.INTEGER,
    id_player: Sequelize.INTEGER,
},
{sequelize: node_app_name.sequelizeDB}); 

Player.belongsToMany(Team, {foreignKey: 'id_player', through: TeamPlayer});
Team.belongsToMany (Player,{foreignKey: 'id_team', through: TeamPlayer});

Player.findAll({    
    include: 
       [{
          model: Team,
          required: false
        }]
}).then(pat => {
   console.log(pat);
});

Надеюсь, это поможет,Обратите внимание, что belongsToMany() ассоциации происходят ПОСЛЕ обе модели инициализированы.

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