【问题标题】:Retrieving chat history between two users sequelize检索两个用户之间的聊天记录续集
【发布时间】:2018-08-11 21:39:06
【问题描述】:

我需要有关如何在 sequelize 中检索两个用户之间的聊天记录的帮助。

我目前有两张桌子;一个用于用户,另一个用于消息

我的 User 表包含用户名、电子邮件和密码等基本信息,而我的 Message 表包含 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;
};

我需要帮助的是如何检索两个用户之间的聊天记录。

【问题讨论】:

    标签: javascript node.js postgresql sequelize.js koa


    【解决方案1】:

    我遇到了这样的问题,我能够通过为两个用户生成唯一标识符来解决它。当用户 A 向用户 B 发送消息时,我会将他们的 userId 组合在一起并存储在数据库中。例如 '234:123' 然后我会将其存储在标识符列内的聊天表中。

    您需要了解的是确保以升序存储 id。例如,如果 id 为 3 的用户 A 向 id 为 2 的用户 B 发送了一条消息,当您想将他们的标识符存储在数据库中时,请确保将其存储为 '3:2',较大的 Id 将首先出现。每当您想检索他们的聊天记录时,只需使用他们的标识符,并再次确保较大的 iD 优先。

    【讨论】:

    • sequelize 是一个 ORM。那么如果我们想在用户登录时加载用户的所有消息该怎么办?
    • @dealwap 您是如何创建这个唯一 ID 的?你用belongsTo了吗? belongsToMany?请给我们举个例子好吗?
    【解决方案2】:

    我认为您可以通过 senderID 和 receiverId 查询消息表。 然后,如果您有很多结果,也许您可​​以按日期过滤查询

    【讨论】:

    • 感谢您的回复,我想要的是显示历史记录。在大多数情况下,当前登录的用户可能是接收者,反之亦然。如何通过关联/JOIN查询它们是我要解决的问题。
    • 可能我没看懂,你的问题是取当前用户的用户名?
    • 让我解释一下;假设我通过receiverId 查询数据库,用户很有可能也是同一用户的消息发送者。我的问题是如何查询两个用户之间的聊天记录,如果 userId 是发送者或接收者,只要它是在另一个用户之间。
    • 你可以这样做:其中:{ [op.or]:[{senderID: some_id},{receiverID:some_id}] }
    • 谢谢,上面的代码将获取发送者/接收者是当前登录用户的位置。例如,如何将聊天获取给特定用户;我们两个之间的聊天消息,你可以给我发消息,我将是接收者,当我给你发消息时,你将是接收者,我需要帮助如何处理这样的问题。
    【解决方案3】:

    不知道 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 2012-04-12
      • 1970-01-01
      • 2019-05-05
      • 2013-01-17
      相关资源
      最近更新 更多