继承 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',
}]
});
我正在尝试制作一个实时通讯应用程序。我正在为我的数据库使用 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',
}]
});