我想做一个简单的聊天应用程序,我的表就像这样(我不知道它是否是实现它的正确方法):
var User = sequelize.define('User', {
userName: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING
}, {
classMethods: {
associate: function(models) {
User.hasMany(models.Friend);
}
}
朋友:
var Friend = sequelize.define('Friend', {
realId: DataTypes.INTEGER,
invitStatus: DataTypes.STRING
}, {
classMethods: {
associate: function(models) {
Friend.hasMany(models.Message);
}
消息:
var Message = sequelize.define('Message', {
text: DataTypes.TEXT,
sentBy: DataTypes.INTEGER
}, {
classMethods: {
associate: function(models) {
}
这是我目前的查询:
models.User.findAll({
where: {
id: req.payload.userId
},
include: [{
model: models.Friend,
include: [{
model: models.Message,
order: [['createdAt', 'DESC']],
limit: 1
}]
}]
}).then(function(result) {
reply(result).code(200);
})
}
一切都运行正常,除了我想告诉sequelize使用Friend表中的realId从User表中获取Friend数据。 我应该使用关键字“通过”吗?即使我多次阅读文档,我也没有确切地知道它是如何工作的。我是SQL的初学者。
感谢您的帮助。
编辑:我当前的输出是:
{
"id": 2,
"userName": "user2",
"email": "user2@example.com",
"password": "123456",
"createdAt": "2016-05-26T16:28:02.000Z",
"updatedAt": "2016-05-26T16:28:13.000Z",
"Friends": [
{
"id": 1,
"realId": 1,
"invitStatus": "accepted",
"createdAt": "2016-05-26T16:30:15.000Z",
"updatedAt": "2016-05-26T16:30:15.000Z",
"UserId": 2,
"Messages": [
{
"id": 18,
"text": "ok",
"sentBy": 1,
"createdAt": "2016-05-26T16:59:36.000Z",
"updatedAt": "2016-05-26T16:59:36.000Z",
"FriendId": 1
}
]
}
我想要的是将“userName”,“email”和“password”值添加到Friends数组中,方法是使用“Friend.realId = User.id”从User表中获取它。
答案 0 :(得分:0)
我不确定清楚地了解你的问题。我假设朋友通过realId
链接到用户,因此您不应该拥有朋友模型,只能使用一个用户模型。
如果这个答案可以帮助任何人,在这种情况下你应该使用自我关联。
您可以使用类似
之类的内容在用户和用户(作为朋友)之间实现自我关联User.belongsToMany(models.User, { as: 'friends', foreignKey: 'userId', through: 'User_Friends' });
如果您的User_Friends模型需要其他属性,您可以像下面一样指定它们,否则将自动创建此连接表。
var User_Friends = sequelize.define('User_Friends', {
// ...
invitStatus: DataTypes.STRING
// ...
}