Sequelize:属性之间的命名冲突'播放列表'以及关联'播放列表'

Sequelize: Naming collision between attribute 'playlist' and association 'playlist'?

本文关键字:播放列表 关联 冲突 属性 之间 Sequelize      更新时间:2023-09-26

我正在使用node.js、Sequelize和MariaDB,遇到以下错误,我不知道如何解决?

错误:属性"播放列表"和关联之间的命名冲突型号playlist_entry上的"播放列表"。要解决此问题,请更改任一foreignKey或者在您的关联定义中

我的Javascript:

Entities = function (settings, context) {
    sequelize = context.sequelize;
    var entities = {
        Playlist: this.sequelize.define('playlist', {
            name: Sequelize.STRING,
            description: Sequelize.STRING
        }),     
        PlaylistEntry: this.sequelize.define('playlist_entry', {
            playlist: Sequelize.INTEGER
            //track: Sequelize.INTEGER
        })
    };  
     entities.PlaylistEntry.belongsTo(
         entities.Playlist,
         { foreignKey: { name: 'fk_playlist' }});
    return entities;                    
}

我的桌子:

CREATE TABLE `playlist` (
  `id` int(11) unsigned NOT NULL,
  `name` varchar(255) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  `createdAt` timestamp NULL DEFAULT NULL,
  `updatedAt` timestamp NULL DEFAULT NULL,
  `external_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `playlist_entry` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `playlist` int(11) unsigned DEFAULT NULL,
  `track` int(11) unsigned DEFAULT NULL,
  `createdAt` timestamp NULL DEFAULT NULL,
  `updatedat` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `track_idx` (`track`),
  KEY `playlist_idx` (`playlist`),
  CONSTRAINT `fk_playlist` FOREIGN KEY (`playlist`) REFERENCES `playlist` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

我在玩Sequelize时遇到了这个问题,这是因为column namereference name是相同的

错误的实现


module.exports = (sequelize, DataTypes) => {
  const session = sequelize.define('session', {
    menteeId: DataTypes.INTEGER,
  }, {});
  session.associate = (models) => {
    session.belongsTo(models.user, {
      foreignKey: 'menteeId',
      as: 'menteeId',
      onDelete: 'CASCADE',
    });
  };
  return session;
};

这里的column namementeeId)和alias namementeeId)是相同的,要解决这个问题,您只需要更改alias name

正确实施


module.exports = (sequelize, DataTypes) => {
  const session = sequelize.define('session', {
    menteeId: DataTypes.INTEGER,
  }, {});
  session.associate = (models) => {
    session.belongsTo(models.user, {
      foreignKey: 'menteeId',
      as: 'MenteeId', // Changes applied here
      onDelete: 'CASCADE',
    });
  };
  return session;
};

在你的情况下,你可以做这个

entities.PlaylistEntry.belongsTo(
    entities.Playlist,
    { 
    foreignKey: { name: 'fk_playlist' },
    as: 'PlayListAlias', // Appropriate name
    },
);