Sequelize определить ассоциацию в массиве - PullRequest
0 голосов
/ 17 июня 2020

У меня есть две модели в Sequelize, как показано ниже:

export const User = db.define('user', {
  id: {
    type: Sequelize.UUID,
    primaryKey: true,
  },
});

export const Class = db.define('class', {
  id: {
    type: Sequelize.UUID,
    primaryKey: true,
  },
  students: Sequelize.ARRAY({
    type: Sequelize.UUID,
    references: { model: 'users', key: 'id' },
  })
});

Как я могу определить связь между моей моделью класса и моделью пользователя?

Я пробовал следующее, но оно дает мне сообщение об ошибке.

Class.hasMany(User, { foreignKey: 'students' });
User.belongsTo(Class);

DatabaseError [SequelizeDatabaseError]: столбец «class_id» не существует

1 Ответ

0 голосов
/ 18 июня 2020

Я думаю, вам не хватает синтаксиса

students: Sequelize.ARRAY({
    type: Sequelize.UUID,
    references: { model: 'users', key: 'id' }, // this has no effect
})

Должно быть

students: {
    type: DataTypes.ARRAY({ type: DataTypes.UUID }),
    references: { model: 'users', key: 'id' }
}

Это тоже не сработает, потому что тип данных students (ARRAY) и id (UUID) из User не соответствует.

Кроме того, с этими ассоциациями вы добавляете два столбца в User, ссылаясь на id из Class, но вам нужно только one

Class.hasMany(User, { foreignKey: 'students' }); //will add students attribute to User

User.belongsTo(Class); //will add classId attribute to User

, если вы хотите назвать столбец внешнего ключа, передайте одно и то же имя в обе ассоциации, по умолчанию Sequelize добавит classId, однако, если вы настроили underscored: true на моделях будет class_id

Вот рабочее решение

const User = sequelize.define('user', {
    id: { type: DataTypes.UUID, primaryKey: true },
});

const Class = sequelize.define('class', {
    id: { type: DataTypes.UUID, primaryKey: true },
    students: DataTypes.ARRAY({ type: DataTypes.UUID }),
});

Class.hasMany(User, { foreignKey: 'class_id' });
User.belongsTo(Class, { foreignKey: 'class_id' });
...