【问题标题】:Sequelize joined table column names for BelongsToMany association为 BelongsToMany 关联续集连接表列名称
【发布时间】:2020-08-30 11:53:35
【问题描述】:

我正在为我的 postgres 数据库使用 sequelize,我有以下两个表:

  1. 艺术家
  2. 专辑

它们之前是使用sequelize.define定义的

这是一个 M:N 关系,所以我决定采用以下关联:

Artist.belongsToMany(Albums, { through: 'ArtistAlbums' }

Album.belongsToMany(Artist, { through: 'ArtistAlbums' }

这很好用,但是后来的 ArtistAlbums 表有非常奇怪的列名:

“ArtistArtistId”、“AlbumAlbumId”指的是艺术家(artistId)和专辑(albumId)的主键。 但是,我只想在其中包含“albumId”和“artistId”,但不知道如何告诉 sequelize 做到这一点。我尝试了以下方法:

  1. 试图在 through 选项中指定一个模型,该模型指定两个这样的键。

问题:我的密钥和生成的密钥都在表中

  1. 我尝试将unique: false 选项添加到它,但也没有用。
  2. 我尝试使用“as”和“sourceKey”、“targetKey”以及“uniqueKey”,但都没有帮助。

任何帮助表示赞赏!

编辑 1:

我认为使用 otherKey 我可以将其中一列设置为我想要的名称,但不能将另一列设置为。

【问题讨论】:

    标签: typescript sequelize.js


    【解决方案1】:

    试试这个:

    Artist.belongsToMany(Album, {
      through: 'ArtistAlbums',
      unique: false,
      foreignKey: 'artistId'
    });
    
    Album.belongsToMany(Artist, {
      through: 'ArtistAlbums',
      unique: false,
      foreignKey: 'albumId'
    });
    

    请注意,我的代码和您的代码之间唯一的区别foreignKey 定义。

    上面的代码在我的 postgreSQL 数据库中创建了以下结果。 (我省略了一些数据):

    CREATE TABLE public."ArtistAlbums"
    (
      "createdAt" timestamp with time zone NOT NULL,
      "updatedAt" timestamp with time zone NOT NULL,
      "artistId" integer NOT NULL,
      "albumId" integer NOT NULL,
      CONSTRAINT "ArtistAlbums_pkey" PRIMARY KEY ("artistId", "albumId"),
      CONSTRAINT "ArtistAlbums_albumId_fkey" FOREIGN KEY ("albumId")
          REFERENCES public."Album" (id) MATCH SIMPLE
          ON UPDATE CASCADE ON DELETE CASCADE,
      CONSTRAINT "ArtistAlbums_artistId_fkey" FOREIGN KEY ("artistId")
          REFERENCES public."Artist" (id) MATCH SIMPLE
          ON UPDATE CASCADE ON DELETE CASCADE
    )
    

    生成我使用的其他表格:

    const Artist = sequelize.define(
      'Artist',
      {
        id: {
          type: DataTypes.INTEGER,
          primaryKey: true
        }
      },
      {
        freezeTableName: true
      }
    );
    
    const Album = sequelize.define(
      'Album',
      {
        id: {
          type: DataTypes.INTEGER,
          primaryKey: true
        }
      },
      {
        freezeTableName: true
      }
    );
    

    【讨论】:

    • 您好,谢谢!那行得通。除了我不得不稍微修改结构,因为在您的回答中,unique 和 foreignKey 处于同一级别。我正在使用打字稿,参数是through: { model: 'ArtistsAlbum', unique: false }, foreignKey: 'artistId'
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 2020-02-03
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多