我有一个遗留的SQL DB,其中的表没有针对Relay Modern进行优化,因为没有一个表具有属性
id
我使用 Sequelize 作为ORM,并使用 express-graphql 作为GraphQl层。
隔离层:
const STAFF = sequelize.define('staff', {
sid: {
// set the primary key for the table
primaryKey: true,
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
unique: true
},
firstName: {
type: Sequelize.STRING,
allowNull: false
}
}
GraphQl层:
const StaffType = new GraphQLObjectType({
name: 'Staff',
description: 'This is the GraphQl schema for the staff table',
fields: () => ({
sid: { type: GraphQLInt },
firstName: { type: GraphQLString }
})
})
如您所见,该表具有唯一键 sid 。
我想知道是否有办法为服务器上的不同唯一键创建别名,以便我可以在客户端使用 Relay Modern 并可以编写如下查询:
{
node(id: "4") {
id
... on Staff {
firstName
}
}
}
以下是Relay必须对字段说的话:
Relay对对象识别的支持取决于GraphQL服务器以标准化方式公开对象标识符。在查询中,模式应提供一种用于通过ID询问对象的标准机制。在响应中,该架构提供了提供这些ID的标准方法。
https://facebook.github.io/relay/graphql/objectidentification.htm
答案 0 :(得分:0)
尝试用StaffType
代替:
const StaffType = new GraphQLObjectType({
name: 'Staff',
description: 'This is the GraphQl schema for the staff table',
fields: () => ({
id: {
type: GraphQLID,
resolve: (parent, args, ctx) => parent.sid
},
firstName: { type: GraphQLString }
})
})
在这里,我们将字段id
从传入的GraphQL查询解析到我们的内部字段sid
。通常,请检查this tutorial以获得有关GraphQL解析器的更多信息。