gpt4 book ai didi

node.js - 为什么 Sequelize 会向 SELECT 查询添加额外的列?

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:20 25 4
gpt4 key购买 nike

当我想从引用的表中获取一些包含连接数据的记录时,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 的其他表。那么是否有必要像我一样在应用程序代码中再次添加关联?

一个结果总是有一个项目和它所属的测试。

我该如何解决这个问题?

提前致谢,

迈克

最佳答案

解决方案:

Result.belongsTo(Test, {foreignKey: 'test_id'});
// Test.hasMany(Result);

Result.belongsTo(Item, {foreignKey: 'item_id'});
// Item.hasOne(Result);

注释掉 hasOne、hasMany 行确实解决了问题。我想我两次定义关联把事情搞砸了。 :|

关于node.js - 为什么 Sequelize 会向 SELECT 查询添加额外的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49424040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com