Sequelize 自关联创建额外的列
Sequelize self association creates extra column
我使用 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;
}
想法是会有 parent 种类型,每个 可能 有几个 sub-genres。当我 运行 sync()
时,table 创建得很好,但是有一个额外的列 (GenreId
) 我无法解释:
"id";"integer";
"name";"character varying";255
"createdAt";"timestamp with time zone";
"updatedAt";"timestamp with time zone";
"GenreId";"integer";
"parentGenreId";"integer";
解释模型的明智方法是只有一个 parentGenreId
列,但我不确定如何定义 bi-directional 关系(流派可能有 parent,流派可能有很多 children),但只添加了一列。
如何修改模型以正确定义关系?
我认为你可以使用 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#getChilren
和 Genre#getParent
编辑:由于@mick-hansen,through
适用于 belongsToMany
,对这种情况没有用。我的错。使用他的建议更正
我使用 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;
}
想法是会有 parent 种类型,每个 可能 有几个 sub-genres。当我 运行 sync()
时,table 创建得很好,但是有一个额外的列 (GenreId
) 我无法解释:
"id";"integer";
"name";"character varying";255
"createdAt";"timestamp with time zone";
"updatedAt";"timestamp with time zone";
"GenreId";"integer";
"parentGenreId";"integer";
解释模型的明智方法是只有一个 parentGenreId
列,但我不确定如何定义 bi-directional 关系(流派可能有 parent,流派可能有很多 children),但只添加了一列。
如何修改模型以正确定义关系?
我认为你可以使用 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#getChilren
和 Genre#getParent
编辑:由于@mick-hansen,through
适用于 belongsToMany
,对这种情况没有用。我的错。使用他的建议更正