Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Graphql - How to perform where clause

Tags:

I am new to graphql and I am struggling with a query. I want to return a user by their email address

I have a type defined call V1User and it has the following fields id, email, password, role

What needs to change in this query to return a user based on email?

    query GetAllV1User {   viewer {      allV1Users{       edges {         node {           id           email           role           createdAt           modifiedAt         }       }     }   } } 

I tried this query

    query getV1UserQuery($email: String!) {   getV1User(email: $email) {     id     email   } } 

With these params

{"email": "[email protected]"} 

But get the following errors

    {   "errors": [     {       "message": "Unknown argument \"email\" on field \"getV1User\" of type \"Query\".",       "locations": [         {           "line": 2,           "column": 13         }       ],       "name": "GraphQLError"     },     {       "message": "Field \"getV1User\" argument \"id\" of type \"ID!\" is required but not provided.",       "locations": [         {           "line": 2,           "column": 3         }       ],       "name": "GraphQLError"     }   ] } 

My Schema is as follows

Name        Type        Constraints  id          ID          NonNull Unique   modifiedAt  DateTime    NonNull  createdAt   DateTime    NonNull  role        String      NonNull  password    String      NonNull  email       String      NonNull Unique Indexed   

Thanks

Hi

This query solved my issue

query getUserForEmailAddressAndPassword($where: V1UserWhereArgs) {   viewer {     allV1Users(where: $where) {       edges {         node {           email           id           createdAt           password           modifiedAt           role         }               }     }   } } 

Along with these query variables

{"where": {"email": {"eq" : "[email protected]"}, "password": {"eq":"te2st"}}} 
like image 721
Damien Gallagher Avatar asked Feb 11 '18 12:02

Damien Gallagher


People also ask

Where is on GraphQL?

GraphQL Query Filter - Where Clause You can filter the data returned by your queries with the where argument. The where argument is applied on a specific field and it filters the results based on that field's value. For example, you can use the where argument to fetch all the private todos.

How do you pass parameters in GraphQL query?

When you're passing arguments in code, it's generally better to avoid constructing the whole query string yourself. Instead, you can use $ syntax to define variables in your query, and pass the variables as a separate map. . then(data => console.


2 Answers

You can do so by using the where clause and comparison operators.

https://hasura.io/docs/latest/graphql/core/databases/postgres/queries/query-filters.html#the-where-argument

query {    authors (where: {articles: {rating: {_gt: 4}}}) {      id      name      articles (where: {rating: {_gt: 4}}) {        id        title        rating      }    }  } 
like image 133
Asma Rahim Ali Jafri Avatar answered Sep 19 '22 05:09

Asma Rahim Ali Jafri


I wouldn't recommend using the string "where" in your filter clause. Don't try to emulate SQL. What are you trying to filter using the where clause. If it's an email address then the query in your schema should contain user as the field and email as a parameter to that field. So the first example that you sent is the right way to do it. Also, avoid declaring queries using verbs like getUsers or getUser. The schema should just declare the query using nouns

Query {    Users(email:String):[User!] }  type User  {     id     email     createdAt     otherStuff } 
like image 27
Aaron Dsouza Avatar answered Sep 21 '22 05:09

Aaron Dsouza