Mysql GraphQL中的Sequelize不连接连接表

Mysql GraphQL中的Sequelize不连接连接表,mysql,sequelize.js,graphql,Mysql,Sequelize.js,Graphql,我有以下表格: 使用者 身份证件 名称 电子邮件 用户\类别\数据 身份证件 标签 用户类别连接表 身份证件 用户id 猫咪 一个用户只能有一个类别。我试图在GraphQL中查询用户内部的类别,以便直接获得类别标签和id: { users(id: 6988) { email category { id label } } } 以下是协会: 使用者 用户分类数据 用户类别连接表 这将在用户的GraphQL类型的resolve函数中创建g

我有以下表格:

使用者

身份证件 名称 电子邮件 用户\类别\数据

身份证件 标签 用户类别连接表

身份证件 用户id 猫咪 一个用户只能有一个类别。我试图在GraphQL中查询用户内部的类别,以便直接获得类别标签和id:

{
  users(id: 6988) {
    email

    category {
      id
      label 
    }
  }
}
以下是协会:

使用者

用户分类数据

用户类别连接表

这将在用户的GraphQL类型的resolve函数中创建getUserCategoryDatum函数。当我运行它时,我会得到以下查询:

SELECT `id`, `email`, `name` FROM `users` AS `user` WHERE `user`.`id` = 6988 ORDER BY `user`.`id` ASC;
SELECT `id`, `label`, `user_id` FROM `users_categories_data` AS `userCategoryData` WHERE `userCategoryData`.`user_id` IN (6988);
显然,这是不正确的,因为users\u categories\u数据表没有user\u id。查询应该进行额外的连接,从连接表中获取cat\u id,然后使用其中的userCategoryData.id=cat\u id查询users\u categories\u数据


我做错了什么?

belongtomany是一种关系,定义为用户有许多类别,类别有许多用户

在您的情况下,例如,用户属于一个类别,而类别有多个用户,您应该向用户表中添加一个类别id,并创建User.belongsToCategory关系。
这样,您就表达了您的约束:用户属于一个类别,并且只有一个。

HasOne关系通常不使用联接表建模。您需要此联接表吗?将hasOne更改为BELONGTOMANY有效。但是,如果我想在连接表上为user_id设置一个唯一的约束,该怎么办?我还应该用belongtomany吗?不,你不应该。归属关系定义为用户有多个类别,类别有多个用户。在您的情况下,例如,用户属于一个类别,而类别有多个用户,您应该向用户表中添加一个类别id,并创建User.belongsToCategory关系。通过这种方式,您表达了您的约束:一个用户属于一个类别,并且只属于一个类别。这就是我创建db结构的方式,但我被告知我们必须对其进行未来验证,以防PO希望用户选择多个类别。那我就坚持下去了。我还使用了“userCategory”,这样就不会使生成的函数多元化。请提交你的答案,我会批准的。谢谢!伟大的做它
associate: (models) => {
  UserCategoryData.belongsToMany(models.user, {
    through: models.userCategory,
    foreignKey: 'cat_id',
  });
}
associate: (models) => {
  UserCategory.belongsTo(models.user, { foreignKey: 'user_id' });
  UserCategory.belongsTo(models.userCategoryData, { foreignKey: 'cat_id' });
},
SELECT `id`, `email`, `name` FROM `users` AS `user` WHERE `user`.`id` = 6988 ORDER BY `user`.`id` ASC;
SELECT `id`, `label`, `user_id` FROM `users_categories_data` AS `userCategoryData` WHERE `userCategoryData`.`user_id` IN (6988);