GraphQL内部的Sequelize不会加入联结表

时间:2017-06-14 07:45:54

标签: mysql sequelize.js graphql

我有以下表格:

用户

  • ID
  • 名称
  • 电子邮件

users_categories_data

  • ID
  • 标签

users_categories(联结表)

  • ID
  • USER_ID
  • CAT_ID

用户只能拥有一个类别。我正在尝试在GraphQL中查询用户内部的类别,以便我可以直接获取类别标签和id:

{
  users(id: 6988) {
    email

    category {
      id
      label 
    }
  }
}

以下是关联:

用户

associate(models) {
  this.hasOne(models.userCategoryData, {
    through: models.userCategory,
    foreignKey: 'user_id',
  });
}

UserCategoriesData

associate: (models) => {
  UserCategoryData.belongsToMany(models.user, {
    through: models.userCategory,
    foreignKey: 'cat_id',
  });
}

UserCategory(联结表)

associate: (models) => {
  UserCategory.belongsTo(models.user, { foreignKey: 'user_id' });
  UserCategory.belongsTo(models.userCategoryData, { foreignKey: 'cat_id' });
},

这会在我的用户的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_categories_data表没有user_id。查询应该执行额外的连接并从联结表中获取cat_id,然后使用users_categories_data

查询WHERE userCategoryData.id = cat_id

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

BelongsToMany是一个定义为用户有许多类别的关系,而类别有很多用户。

在您的情况下,例如用户属于一个类别,而类别有许多用户,您应该向category_id表添加Users并创建User.belongsTo(Category)关系。
这样,您就表达了您的约束:用户属于一个类别,只有一个。