继承 ORM M-M 关系

Sequelize ORM M-M Relationship

我正在尝试制作一个实时通讯应用程序。我正在为我的数据库使用 mysql 并使用 Sequelize 作为 ORM。我不确定我应该如何设置我的对话模式。

一个用户可以有很多对话,一个对话可以有很多用户(只有2个),所以我假设我选择多对多关系是正确的。

在尝试这个时,我最终得到了一个 table 与 user_id 和 conversation_id 的交汇点。因此,当一个对话将插入 2 行时,每行一行 user_id。我的问题在于查询特定用户的对话。当我这样做时,我还想获得对话中第二个用户的 user_id 和其他详细信息。

目前,我的查询如下所示....

         const user_convos = await db.models.conversations.findAll({
            include: [{
                model: db.models.users,
                through: {
                    where: {userId: uid},
                    attributes: ['userId']
                }
            }]
        });

我的 json 输出看起来像这样...

{
    "id": 2,
    "latest_message": "Hello World",
    "createdAt": "2022-04-06T00:11:08.000Z",
    "updatedAt": "2022-04-06T00:11:08.000Z",
    "users": [
        {
            "id": 1,
            "email": "john@mail.com",
            "username": "john101",
            "first_name": "John",
            "last_name": "Smith",
            "conversation_user": {
                "userId": 1
            }
        }
    ]
}

正如您在 json 对象的 users 键中看到的那样,我只获得了进行查询的用户的数据,但我还想要会话中其他用户的数据。如前所述,这个其他用户将在连接点 table 中有自己的行,所以我最明显的方法是使用输出中的 'id' 查询所有对话,然后获取另一个用户id,然后查询他们的信息。

虽然这可能会奏效,但从长远来看,这听起来冗长且不可持续 运行,因为我将进行多次查询。我确信有一个更简单的方法来解决这个问题(一如既往),我非常感谢任何关于更简单的方法来解决这个问题的反馈(也许是某种高级查询方法或不同的数据库模式......)。

提前致谢!

如果它始终是 one-to-one 对话,那么您根本不需要连接点 table。只需在对话中添加两个用户 ID 列 table.
在这种情况下,关联可能如下所示:

conversations.belongsTo(users, { foreignKey: 'initiator_id', as: 'initiator' })
conversations.belongsTo(users, { foreignKey: 'other_person_id', as: 'otherPerson' })

Sequelize 查询可能如下所示:

 const user_convos = await db.models.conversations.findAll({
            include: [{
                model: db.models.users,
                as: 'initiator',
                where: { id: uid },
            }, {
                model: db.models.users,
                as: 'otherPerson',
            }]
        });