检索两个用户之间的聊天记录 sequelize
Retrieving chat history between two users sequelize
我需要有关如何在 sequelize 中检索两个用户之间的聊天记录的帮助。
我目前有两个 table;一个用于 users,另一个用于 messages.
我的 User table 有用户名、电子邮件和密码等基本信息,而我的 Message table具有 senderId、receiverId 和 message
等信息
下面是我的模型的代码。
消息模型
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Messages', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
receiverId: {
type: Sequelize.INTEGER,
onDelete: 'CASCADE',
references: {
model: 'Users',
key: 'id',
as: 'receiverId',
}
},
identifier: {
type: Sequelize.INTEGER,
defaultValue: 0
},
senderId: {
type: Sequelize.INTEGER,
onDelete: 'CASCADE',
references: {
model: 'Users',
key: 'id',
as: 'senderId',
}
},
message: {
type: Sequelize.TEXT
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Messages');
}
};
用户模型
'use strict';
module.exports = (sequelize, DataTypes) => {
var User = sequelize.define('User', {
username: {
type: DataTypes.STRING,
unique: true
},
email: {
type: DataTypes.STRING,
unique: true
},
password: DataTypes.STRING
}, {
classMethods: {
associate: function (models) {
// associations can be defined here
User.hasMany(models.Message, {
onDelete: 'CASCADE',
foreignKey: 'senderId'
});
User.hasMany(models.Message, {
onDelete: 'CASCADE',
foreignKey: 'receiverId'
});
}
}
});
return User;
};
我需要帮助的是如何检索两个用户之间的聊天记录。
我认为您可以通过 senderID 和 receiverId 查询消息 table。
然后,如果你有很多结果,也许你可以按日期过滤查询
我遇到了这样的问题,我能够通过为这两个用户生成唯一标识符来解决它。当用户A给用户B发消息时,我会把他们的userId组合在一起存入数据库。例如 '234:123' 那么我会将其存储在标识符列内的聊天 table 中。
您需要了解的是确保您按升序存储 ID。例如,如果 ID 为 3 的用户 A 向 ID 为 2 的用户 B 发送了一条消息,当您想将其标识符存储在数据库中时,请确保将其存储为“3:2”,较大的 ID 将首先出现。每当您想检索他们的聊天记录时,只需使用他们的标识符,并再次确保较大的 iD 在前。
不知道 Sequelize,但我使用 MySQL 查询获得了记录,您可以将其转换为 Sequelize
SELECT t1.*
FROM chats t1
WHERE (t1.senderPseudo = 'salahudin'
OR t1.receiverPseudo = 'salahudin') AND t1.createdAt = (SELECT MAX(t2.createdAt)
FROM advertz.chats t2
WHERE t2.senderPseudo = t1.senderPseudo)
我需要有关如何在 sequelize 中检索两个用户之间的聊天记录的帮助。
我目前有两个 table;一个用于 users,另一个用于 messages.
我的 User table 有用户名、电子邮件和密码等基本信息,而我的 Message table具有 senderId、receiverId 和 message
等信息下面是我的模型的代码。
消息模型
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Messages', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
receiverId: {
type: Sequelize.INTEGER,
onDelete: 'CASCADE',
references: {
model: 'Users',
key: 'id',
as: 'receiverId',
}
},
identifier: {
type: Sequelize.INTEGER,
defaultValue: 0
},
senderId: {
type: Sequelize.INTEGER,
onDelete: 'CASCADE',
references: {
model: 'Users',
key: 'id',
as: 'senderId',
}
},
message: {
type: Sequelize.TEXT
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Messages');
}
};
用户模型
'use strict';
module.exports = (sequelize, DataTypes) => {
var User = sequelize.define('User', {
username: {
type: DataTypes.STRING,
unique: true
},
email: {
type: DataTypes.STRING,
unique: true
},
password: DataTypes.STRING
}, {
classMethods: {
associate: function (models) {
// associations can be defined here
User.hasMany(models.Message, {
onDelete: 'CASCADE',
foreignKey: 'senderId'
});
User.hasMany(models.Message, {
onDelete: 'CASCADE',
foreignKey: 'receiverId'
});
}
}
});
return User;
};
我需要帮助的是如何检索两个用户之间的聊天记录。
我认为您可以通过 senderID 和 receiverId 查询消息 table。 然后,如果你有很多结果,也许你可以按日期过滤查询
我遇到了这样的问题,我能够通过为这两个用户生成唯一标识符来解决它。当用户A给用户B发消息时,我会把他们的userId组合在一起存入数据库。例如 '234:123' 那么我会将其存储在标识符列内的聊天 table 中。
您需要了解的是确保您按升序存储 ID。例如,如果 ID 为 3 的用户 A 向 ID 为 2 的用户 B 发送了一条消息,当您想将其标识符存储在数据库中时,请确保将其存储为“3:2”,较大的 ID 将首先出现。每当您想检索他们的聊天记录时,只需使用他们的标识符,并再次确保较大的 iD 在前。
不知道 Sequelize,但我使用 MySQL 查询获得了记录,您可以将其转换为 Sequelize
SELECT t1.*
FROM chats t1
WHERE (t1.senderPseudo = 'salahudin'
OR t1.receiverPseudo = 'salahudin') AND t1.createdAt = (SELECT MAX(t2.createdAt)
FROM advertz.chats t2
WHERE t2.senderPseudo = t1.senderPseudo)