sequelize.js - 如何在sequelize中查询多对多关系
问题描述
我一直在通过 sequelize 在 postgres db 上使用 feathersjs/nodejs。在我的数据库中,我有用户表和事件表。它们有两倍的关系:
events.belongsTo(models.users, {
foreignKey: {
name: 'creatorId',
allowNull: false
},
onDelete: 'CASCADE',
as: 'creator'
});
events.belongsToMany(models.users, {
through: 'event_participants',
as: 'participants',
foreignKey: 'eventId',
otherKey: 'userId'
});
models.users.belongsToMany(events, {
through: 'event_participants',
as: 'events'
});
一切正常,创建了表格,并包括让用户作为参与者参与活动。问题是通过关联查询。我正在尝试为当前用户获取事件,所以我需要创建者是当前用户的事件和参与者之一是当前用户的事件。问题是第二部分“查询当前用户是参与者之一的位置”。我期待这样的事情
'api/events?$or[0][creatorId]=currUserId&$or[1][participants][$contains]=currUserId'
但它不起作用,因为没有包含“参与者”这样的列,所以我无法查询它。所以现在我只是获取所有事件并在后挂钩中为当前用户过滤它们,但这似乎是错误的。这样做的正确方法是什么?
是的,我知道我可以通过将用户包含在用户中并获取他来获取用户是参与者之一的事件,但问题是我无法将这些数据全部排序,它被单独排序,另一个问题是在前端进行分页。
解决方案
查询嵌套关联不是 Feathers 通用查询语法的一部分。在 Sequelize 的情况下,应根据您的需要使用params.sequelize组装查询,并包括如feathers-sequelize 关联文档中所示:
// GET /my-service?name=John&include=1
function (context) {
if (context.params.query.include) {
const AssociatedModel = context.app.services.fooservice.Model;
context.params.sequelize = {
include: [{
model: AssociatedModel
// normal Sequelize where query here
}]
};
// delete any special query params so they are not used
// in the WHERE clause in the db query.
delete context.params.query.include;
}
return Promise.resolve(context);
}
推荐阅读
- javascript - xhttp.open 函数没有响应
- css - 垂直对齐顶部不适用于 dt 和 dd 元素
- list - 如何在 Java 中循环赋予队列列表各种名称?
- mysql - MySQL (Aurora) 使用 adddate 或 date-add 或 date-sub 更新时间戳表示语法错误
- php - 当刀片中的数组中缺少 img 时,Laravel 创建 if 语句
- python - 如何使用 pandas 修改特定的 csv 文件
- mysql - mysql - 将匹配多个字段(接近重复项)的除 1 条记录之外的所有记录标记为已删除
- python - 使用 pandas 保存带有扩展 ascii 分隔符的 csv 文件
- jquery - 根据选择选项值将 a 添加到计数器
- angular - 为什么我不能得到我的
当我在 html 元素上使用 click 事件时显示正确的 html?