Mysql 继续选择id而不是外键
我有一个Mysql 继续选择id而不是外键,mysql,sequelize.js,graphql,Mysql,Sequelize.js,Graphql,我有一个Book表、一个Category表和一个名为BookCategories的联接表。这是一个过于简化的结构: books { id, name, hash // unique } categories { id, name } book_categories { id, book_hash, category_id } 由于应用程序的工作方式,决定在联接表中使用book\u散列,而不是book\u id 以下是三个表之间的续集关系: // book B
Book
表、一个Category
表和一个名为BookCategories
的联接表。这是一个过于简化的结构:
books {
id,
name,
hash // unique
}
categories {
id,
name
}
book_categories {
id,
book_hash,
category_id
}
由于应用程序的工作方式,决定在联接表中使用book\u散列
,而不是book\u id
以下是三个表之间的续集关系:
// book
Book.hasMany(models.bookCategories, { foreignKey: 'book_hash' });
// category
Category.hasMany(models.bookCategories, { foreignKey: 'category_id' });
// bookCategories
BookCategories.belongsTo(models.book, { foreignKey: 'collection_hash' });
BookCategories.belongsTo(models.category, { foreignKey: 'category_id' });
我将Sequelize与GraphQL一起使用,因此在CategoryType
上创建books
字段时,一切都很好:
books: {
type: new GraphQLList(BookType),
args: defaultListArgs(),
async resolve(f, args) {
return await f.getBookCategories(args);
// normally doesn't return, uses results to get book hashes and return books
}
}
它运行以下查询:
SELECT `id`, `name` FROM `categories` ASC;
SELECT `id`, `book_hash`, `category_id` FROM `book_categories` AS `bookCategories` WHERE `bookCategories`.`category_id` IN (1, 2, 3, 4, 5);
但当以另一种方式通过图书类型
请求图书类别时,它不会:
categories: {
type: new GraphQLList(CategoryType),
args: defaultListArgs(),
async resolve(f, args) {
return await f.getBookCategories(args);
// normally doesn't return, uses results to get category ids and return categories
}
}
它运行以下查询:
SELECT `id`, `name`, `hash`, FROM `books` AS `book` WHERE `book`.`hash` = 'ft3qvqlj';
SELECT `id`, `book_hash`, `category_id` FROM `book_categories` AS `bookCategories` WHERE `bookCategories`.`book_hash` IN (93586);
如您所见,即使我将外键设置为两个关系上的哈希,它仍然使用book id进行查询。这与hash
不是books
表上的主键有关吗
是否有办法解决此问题,或者我必须重做数据库结构?如果不将任何列声明为主键,sequelize将假定book id为主键。并将其用于关联查询。另外,您可能需要使用1.7.X版来执行soI did声明
id
作为books表中的主键。为什么它认为即使我将散列指定为外键,我也要使用id
?是的,问题是必须有一个主键被其他表用作外键,您必须将散列作为主键