Il n'est pas clair quand utiliser GraphQLID
au lieu de GraphQLInt
.
Considérez le schéma suivant:
type User {
id: Int!
firstName: String!
lastName: String!
}
type Query {
user (id: ID!): User
}
En cas de Query.user
, il ne semble pas y avoir de différence d'utiliser GraphQLID
ou GraphQLInt
.
En cas de User.id
, en utilisant GraphQLID
convertira l'entrée en chaîne. L'utilisation de GraphQLInt
garantira que l'entrée est un entier.
Cela rend le système de requête et de type incohérent.
graphql-jsspec dit simplement:
Un
GraphQLScalarType
qui représente un ID.
S'agit-il d'un détail d'implémentation (par exemple, le client GraphQL doit-il convertir GraphQLID
en un entier quand il le peut), ou est-il prévu que ID
soit toujours une chaîne dans graphql ?
J'ai jeté un œil à la spécification GraphQL.
Le type scalaire ID représente un identifiant unique, souvent utilisé pour récupérer un objet ou comme clé pour un cache. Le type d'ID est sérialisé de la même manière qu'un
String
; cependant, il n'est pas destiné à être lisible par l'homme. Bien qu'il soit souvent numérique, il doit toujours être sérialisé enString
.
- https://facebook.github.io/graphql/April2016/#sec-ID
Cela répond à la question de savoir si elle est laissée à l'implémentation ou dictée par la spécification, c'est-à-dire que l'ID doit toujours être sérialisé en String
.
De plus, dans le contexte d'un type d'entrée, l'entrée doit être contrainte dans une chaîne. De la spécification:
Contrainte d'entrée
Lorsqu'elle est attendue comme type d'entrée, toute chaîne (telle que
"4"
) ou entier (tel que4
) la valeur d'entrée doit être contrainte à l'ID en fonction des formats d'ID attendus par un serveur GraphQL donné. Toute autre valeur d'entrée, y compris les valeurs d'entrée flottantes (telles que4.0
), doit générer une erreur de requête indiquant un type incorrect.
Cela me laisse avec le problème d'origine.
J'ai un backend mysql où mes PK sont des entiers.
La façon dont je le vois, j'ai ces options:
base64
dérivé d'une concaténation du nom de la table et de la valeur PK.Je vais avec cette dernière option. C'est également l'approche qui graphql-relay-js
a adopté via toGlobalId
et fromGlobalId
.