Jer*_*mys 1 sql node.js sequelize.js
希望你做得很好。
我有sequelizejs的问题,无论如何在表之间建立关联,由于某种原因我都无法工作。我的问题是,我有一个名为Results的表,该表的结构为:
| id (primary) | first_guy_id | second_guy_id | third_guy_id | notes |
|--------------|--------------|---------------|--------------|-------|
| | | | | |
Run Code Online (Sandbox Code Playgroud)
该表连接到Users,这是有趣的部分,表Users具有简单的结构,如下所示
| id (primary) | first | last |
|--------------|-------|------|
| | | |
Run Code Online (Sandbox Code Playgroud)
我想对sequelize进行的操作是,获得一个类似于以下内容的结果(在json中),并嵌套连接:
{
"id": 17,
"first_guy_id": { "id": 12, "first": "First .... },
"second_guy_id": { "id": 14, "first": "First .... },
"third_guy_id": { "id": 19, "first": "First .... },
"notes": "notes",
}
Run Code Online (Sandbox Code Playgroud)
即使每列(first_guy,second ...)的所有ID都不相同,在常规SQL中执行SQL JOIN也很容易,但是达到这样的目标会使我自己完全没有希望。
当我以这种方式关联两个表时:
Results.hasOne(User, { as:'first_guy', foreignKey: 'first_guy' });
User.belongsTo(Results, { as: 'first_guy' });
Run Code Online (Sandbox Code Playgroud)
使用进行实际通话时
findOne ...
include: [
{ model: User,
include: [
{
model: User,
as: 'first_ugy',
where: {
'id': sequelize.col('Results.first_guy_id')
},
}
],
},
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ER_BAD_FIELD_ERROR: Unknown column 'Results.user_id' in 'field list'
Run Code Online (Sandbox Code Playgroud)
当然,这是因为它查找user_id作为外键,并连接到表“ User”,它认为该键应为user_id。
我找到此解决方案的两个问题是:
如何将结果与任何常规字段(在此处为伪代码)进行序列化连接的方式相同,“将Results.first_guy_id上的INNER JOIN User.id设为MY_FIELD_NAME ”
如何将所有这些字段连接到同一模型,但每一列的结果不同?因此,来自“ 结果”的获取结果将通过该特定行的“ 结果”表中列出的ID返回嵌套的3个不同用户。使用相同的模型?
我浏览了sequelize的文档,尝试了多种组合,但从未达到结果。几乎感觉就像我不得不结束编写模型,这些模型被命名为“ First_gu”,“ second_guy”,“ third_guy”等字段,Sequalize才能工作并像现在使用User模型一样在其中自动附加“ _id” 。但是,对于应该由belongsTo / hasOne中的“ foreignKey”属性解决的问题,这感觉太费力了?
这是一个简单的解决方案。您应该为每个结果列定义关系。
Results.belongsTo(User, { as:'firstGuy', foreignKey: 'first_guy_id'});
Results.belongsTo(User, { as:'secondGuy', foreignKey: 'second_guy_id'});
...
Run Code Online (Sandbox Code Playgroud)
然后,您可以像这样进行查询:
Results.findById(resultId, {
include: [{
model: User,
as: 'firstGuy'
}, {
model: User,
as: 'secondGuy'
},
...
]
}).then(function(result){
var firstGuyUser = result.firstGuy;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3346 次 |
| 最近记录: |