2017-10-12 96 views
0

我使用nodejs工作后缀,我尝试将我的查询代码从mysql查询转换为sequelize语法你能帮我解决这个问题吗?将查询从mysql客户端转换为续集语法

MySQL查询:

select username,message,fromUserId,toUserID from messages inner join messageToUsers on messages.id = messageToUsers.messageID left outer join users on messages.fromUserID = users.id where messageToUsers.`toUserID` = 5 and messages.`fromUserId` = 7 or messageToUsers.`toUserID` = 7 and messages.`fromUserId` = 5 

sequlize查询

Message.hasMany(MessageToUser,{foreignKey:'messageID'}); 
    Message.belongsTo(Users,{foreignKey:'fromUserId'}); 
    Message.findAll({where:{fromUserId :5,fromUserID : 7}, 
     include :[ 
      {model:MessageToUser,where:{toUserID:5,toUserID:7}} , 
      {model:Users,attributes:['id','username']} 
     ] 

    }).then(function(messages) { 
     console.log(JSON.stringify(messages)); 
     res.status(200).json(messages); 


    }) 

回答

0

你缺少你的属性

Message.hasMany(MessageToUser,{foreignKey:'messageID'}); 
Message.belongsTo(Users,{foreignKey:'fromUserId'}); 
Message.findAll({where:{fromUserId :5,fromUserID : 7}, 
    include :[ 
     {model:MessageToUser,where:{toUserID:5,toUserID:7}} , 
     {model:Users,attributes:['id','username']} 
    ], 
    attributes: ["username","message", "toUserId", "fromUserId"] //<-HERE 

}).then(function(messages) { 
    console.log(JSON.stringify(messages)); 
    res.status(200).json(messages); 


}); //<- you also missed a semicolon here. 

我注意到第二件事。如果您在where的相同型号中使用相同的字段两次,其中一个将被忽略。您需要使用$and

{model:MessageToUser,where:{ 
    $and: {[toUserID:5], 
      [toUserID:7]} 
}} 

注:在声明的末尾缺少分号通常不会导致应用程序失败,但是一致的最佳实践,可以一直使用它们或总是忽略它们。

0

我解决了这个问题,感谢大家

Message.hasMany(MessageToUser,{foreignKey:'messageID',as: 'model1'}); 
    Message.belongsTo(Users,{foreignKey:'fromUserId'}); 
    Message.findAll({where:{$or:[{'$model1.toUserId$':toUserId,fromUserId:fromUserID},{'$model1.toUserId$':fromUserID,fromUserId:toUserId}]}, 
     include :[ 
      {attributes: ["toUserId"],model:MessageToUser,as: 'model1'} , 
      {attributes: ["username"],model:Users} 
     ] 

    }).then(function(messages) { 
     console.log(JSON.stringify(messages)); 
     res.status(200).json(messages); 


    });