为什么sequelize为外键列使用不同的名称?

时间:2017-08-03 11:40:22

标签: sequelize.js

我有一个问题,即sequelize正在使用"推断"外键列的名称,而不是模型中定义并在数据库中使用的列名。

这发生在upsert和findAll上。

举个例子,给出以下模型:

Parent.hasMany(Child, {
    as: 'parentChildren',
    foreignKey: { field: 'fkParentId', allowNull: false },
    constraints: true,
    onDelete: 'CASCADE'
});

当我对一个Child进行upsert时,sequelize希望upsert JSON使用名称" parentId"对于外键领域。

同样,如果我执行Child.findAll(只有一个简单的where条件),则JSON结果使用名称" parentId"为了这个领域。在我的数据库日志中,我可以看到sequelize FORCING名称为parentId,例如:

SELECT field 1, field 2, etc, fkParentId AS parentId

我尝试通过添加Child.belongsTo来定义关系的两个方面,并且我尝试使用sourceKey / targetKey,但这没有区别。

有没有办法让sequelize接受并返回列的实际名称?

2 个答案:

答案 0 :(得分:1)

如果您查看该关联的文档,您看起来只是字段不匹配。请参阅http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-hasMany - 看起来在数据库中设置外键行名称的键实际上是name键(如果您使用foreignKey的对象作为反对只是一个字符串)。

尝试使用此...

Parent.hasMany(Child, {
  as: 'parentChildren',
  foreignKey: { name: 'fkParentId', allowNull: false },
  constraints: true,
  onDelete: 'CASCADE'
});

我对Sequelize 3.x.x有更多经验,但这应该适用于4.x.x.如果这不起作用,那么我知道如果你在关联函数调用中为foreignKey项使用一个字符串,它将根据你的需要设置列的名称。

如果是这种情况,那么您实际上可以在子模型的属性列表中手动创建列,并使用我在上面提到的字符串foreignKey

祝你好运! :)

答案 1 :(得分:0)

你应该在这里使用otherKey

Parent.hasMany(Child, {
    as: 'parentChildren',
    foreignKey: { field: 'fkParentId', allowNull: false },
    otherKey: 'fkParentId'
    constraints: true,
    onDelete: 'CASCADE'
});