我有一个问题,即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接受并返回列的实际名称?
答案 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'
});