当我想从引用的表中获取一些连接数据的记录时,Sequelize会将参考列添加两次:正常的列和它们的副本,只是略有不同。
这是我的模特:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('result', {
id: {
type: DataTypes.INTEGER(10),
allowNull: false,
primaryKey: true,
autoIncrement: true
},
test_id: {
type: DataTypes.INTEGER(10),
allowNull: false,
references: {
model: 'test',
key: 'id'
}
},
item_id: {
type: DataTypes.INTEGER(10),
allowNull: false,
references: {
model: 'item',
key: 'id'
}
},
}, // and many other fields
{
tableName: 'result',
timestamps: false, // disable the automatic adding of createdAt and updatedAt columns
underscored:true
});
}
在我的存储库中,我有一个方法,它通过连接数据获取结果。我定义了以下关联:
const Result = connection.import('../../models/storage/result');
const Item = connection.import('../../models/storage/item');
const Test = connection.import('../../models/storage/test');
Result.belongsTo(Test, {foreignKey: 'test_id'});
Test.hasOne(Result);
Result.belongsTo(Item, {foreignKey: 'item_id'});
Item.hasOne(Result);
// Defining includes for JOIN querys
var include = [{
model: Item,
attributes: ['id', 'header_en']
}, {
model: Test,
attributes: ['label']
}];
var getResult = function(id) {
return new Promise((resolve, reject) => { // pass result
Result.findOne({
where: { id : id },
include: include,
// attributes: ['id',
// 'test_id',
// 'item_id',
// 'result',
// 'validation'
// ]
}).then(result => {
resolve(result);
});
});
}
该函数产生以下查询:
SELECT `result`.`id`, `result`.`test_id`, `result`.`item_id`, `result`.`result`, `result`.`validation`, `result`.`testId`, `result`.`itemId`, `item`.`id` AS `item.id`, `item`.`title` AS `item.title`, `test`.`id` AS `test.id`, `test`.`label` AS `test.label` FROM `result` AS `result` LEFT OUTER JOIN `item` AS `item` ON `result`.`item_id` = `item`.`id` LEFT OUTER JOIN `test` AS `test` ON `result`.`test_id` = `test`.`id` WHERE `result`.`id` = '1';
注意要从结果表中选择的额外itemId,testId。我不知道这发生了什么。这会产生:
Unhandled rejection SequelizeDatabaseError: Unknown column 'result.testId' in 'field list'
仅在我指定要选择的属性时才有效。
编辑:我的数据库中的表已经引用了包含item_id和test_id的其他表。那么就像我一样在应用程序代码中再次添加关联吗?
结果总是有一个项目并且测试它属于。
我该如何解决这个问题?
提前致谢,
麦克
答案 0 :(得分:1)
Sequelize默认情况下通过在模型名称中添加id来使用这些列名。如果要停止它,则需要指定一个选项。
underscored: true
您可以在应用程序级别和模型级别指定此属性。
此外,您还可以关闭时间戳。您需要使用时间戳选项。
timestamps: false
答案 1 :(得分:1)
<强> SOLUTION:强>
Result.belongsTo(Test, {foreignKey: 'test_id'});
// Test.hasMany(Result);
Result.belongsTo(Item, {foreignKey: 'item_id'});
// Item.hasOne(Result);
注释掉hasOne,hasMany行确实解决了这个问题。我想通过两次定义关联来搞砸了它。 :|