javascript - Sequelize 自引用多对多;如何指定我加入的内容
问题描述
我有一个 Sequelize 结构,User
它通过一个Follow
表将我的表与自身相关联,使用follower
and following
。我有 99% 的把握,我拥有所有必要的部件,可以按照我期望的方式工作;我有别名
User.belongsToMany(models.User, { through: models.Follow, as: 'Followers', foreignKey: 'follower'});
User.belongsToMany(models.User, { through: models.Follow, as: 'Following', foreignKey: 'following'});
也
User.hasMany(models.Follow, { foreignKey: 'following' });
User.hasMany(models.Follow, { foreignKey: 'follower' });
和
Follow.belongsTo(models.User, { foreignKey: 'following', as: 'Following' });
Follow.belongsTo(models.User, { foreignKey: 'follower', as: 'Follower' });
我可以打电话
User.findByPk(id, {
include: {
model: Follow
}
});
它返回一个用户和一个 Follow 条目数组。
我遇到的问题是,Sequelize 似乎默认将Follow
查询创建为where: { followING: User.id }
而不是where: followER
,这样如果我有 1 个用户关注自己和其他 2 个人,但只有他们自己关注,它只会从我的关注表返回 1 个结果. 当我循环遍历种子中少数用户的主键时,只有following
结果中的值会发生变化,因此我只会返回用户的关注者,而不是用户关注的其他用户。
当多个列与我要加入的 Sequelize 对象匹配时,有没有办法在include
我尝试加入的特定列中指定?
我知道最坏的情况我总是可以跳过User
迈步直奔
Follow.findAll({
where: {
follower: id
}
})
但这限制了我对 User 对象的直接访问,并且我必须编写一个额外的查询,考虑到存在自关联的多对多功能,这似乎很麻烦。
解决方案
如果您希望获得具有关注者或关注用户的用户,则无需指明Follow
表格。您只需要指明所需关联的别名:
User.findByPk(id, {
include: {
model: User,
as: 'Followers'
}
});
User.findByPk(id, {
include: {
model: User,
as: 'Following'
}
});
如果您需要Follow
直接包含,则需要添加如下关联:
User.hasMany(models.Follow, { as: 'FollowerLinks', foreignKey: 'follower'});
User.hasMany(models.Follow, { as: 'FollowingLinks', foreignKey: 'following'});
您还应该指定一个别名,以便 Sequelize 知道要使用什么关联:
User.findByPk(id, {
include: {
model: Follow,
as: 'FollowerLinks'
}
});
推荐阅读
- animation - 如何创建响应式 svg 边框动画
- python-3.x - Morningstar 用 python 请求获取 10 年的财务数据
- java - Spring security - oauth2 资源服务器测试
- python - PyMongo:更新很多,熊猫数据框
- android - 滚动到列表视图条目后如何使其闪烁?
- regex - 为什么我在 influxdb 中为单个测量获得多个表
- macos - 当两个 macOS .plugin 依赖于同一个 .dylib 并且每个都将它单独捆绑在插件文件夹中时会发生什么?
- python - 正则表达式:匹配括号括起来的字符串中的某个单词
- c# - KeyBinding 用作 UserControl 但在 XAML 中使用属性元素语法时不起作用
- visual-c++ - 非成员函数和抽象类