我想做一个简单的聊天应用程序,我的表格是这样的(我不知道这是否是实现它的正确方法):
var User = sequelize.define('User', {
userName: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING
}, {
classMethods: {
associate: function(models) {
User.hasMany(models.Friend);
}
}
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从User表中获取Friend数据以及从Friend表中获取realId。 我应该使用关键字“through”吗?尽管我多次阅读了文档,但我还是不明白它是如何工作的。我是 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 表中获取值。
最佳答案
我不确定是否清楚地理解您的问题。我假设 Friends 通过 realId
链接到 User,因此您不应该有 Friends 模型,而只有一个 User 模型。
如果这个答案可以帮助任何人,在这种情况下,您可能应该使用自关联。
您可以通过类似的方式实现用户和用户(作为 friend )之间的自关联
User.belongsToMany(models.User, { as: 'friends', foreignKey: 'userId', through: 'User_Friends' });
如果您的 User_Friends 模型需要其他属性,您可以像下面这样指定它们,否则将自动创建此连接表。
var User_Friends = sequelize.define('User_Friends', {
// ...
invitStatus: DataTypes.STRING
// ...
}
关于mysql - 序列化 findAll 和 Join 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37496521/