【问题标题】:Sequelize self association creates extra columnSequelize 自关联创建额外的列
【发布时间】:2015-01-08 02:26:50
【问题描述】:

我使用 Sequelize 定义了以下模型:

module.exports = function (sequelize, DataTypes) {
  var Genre = sequelize.define('Genre', {
    name: {
      type: DataTypes.STRING,
      allowNull: false
    }
  }, {
    classMethods: {
      associate: function (models) {
        Genre.hasMany(models.Genre, {as: 'subGenre'});
        Genre.belongsTo(models.Genre, {as: 'parentGenre'});
      }
    }
  });

  return Genre;
}

这个想法是会有父流派,每个可能有几个子流派。当我运行sync() 时,表创建得很好,但是有一个额外的列(GenreId)我无法解释:

"id";"integer";
"name";"character varying";255
"createdAt";"timestamp with time zone";
"updatedAt";"timestamp with time zone";
"GenreId";"integer";
"parentGenreId";"integer";

解释模型的明智方法是只有一个parentGenreId 列,但我不确定如何定义只有一列的双向关系(流派可能有父,流派可能有很多子)已添加。

如何修改模型以正确定义关系?

【问题讨论】:

    标签: postgresql sequelize.js


    【解决方案1】:

    我认为你可以使用through(未测试)

    module.exports = function (sequelize, DataTypes) {
      var Genre = sequelize.define('Genre', {
        name: {
          type: DataTypes.STRING,
          allowNull: false
        }
      }, {
          classMethods: {
            associate: function (models) {
              Genre.hasMany(models.Genre, {as: 'children', foreignKey: 'ParentId'});
              Genre.belongsTo(models.Genre, {as: 'parent', foreignKey: 'ParentId'});
            }
          }
    });
    
      return Genre;
    }
    

    所以你可以有Genre#getChilrenGenre#getParent

    编辑:由于@mick-hansen,through 适用于belongsToMany,对这种情况没有用处。我的错。使用他的建议进行了更正

    【讨论】:

    • 没有 through 这样的东西,但它可能会在 hasMany 上创建一个连接表。为此,他可能只是希望foreignKey: 'ParentId' 确保关系双方使用相同的外键
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2020-08-25
    相关资源
    最近更新 更多