2017-10-08 3 views
1

J'essaie de savoir comment utiliser les arguments sur les éléments imbriqués dans ma requête en utilisant Absinthe.Comment utiliser les arguments sur les éléments imbriqués dans ma requête en utilisant Absinthe dans Elixir?

Ce que je tente d'accomplir est la suivante:

{ 
    users(order: ASC) { 
    id 
    email 
    clients(order: DESC) { 
     id 
     email 
    } 
    } 
} 

Voici mon schéma et Type:

query do 
    @desc "Get all users" 
    field :users, list_of(:user) do 
     arg :order, type: :sort_order, default_value: :asc 
     resolve &Resolvers.users/2 
    end 
    end 

    @desc "A user" 
    object :user do 
    field :id, :id 
    field :email, :string 
    field :clients, list_of(:user) 
    end 

Et le résolveur:

def users(_, args, _) do 
    args 
    |> Enum.reduce(User, fn 
     {:order, order}, query -> 
     query |> order_by({^order, :email}) 
    end) 
    |> Repo.all |> Repo.preload([:clients]) 
    end 

Alors ma question est de savoir comment et où devrais-je placer l'argument de tri pour les clients? Avec l'exemple ci-dessus je reçois une erreur:

"message": "Unknown argument \"order\" on field \"clients\" of type \"User\"." 
+0

Ce [Q & A] (https://stackoverflow.com/questions/34155439/getting-error-unknown-argument-id-on-field-user-of-type-query-graphql?rq=1) pourrait avoir quelque chose pour vous aider . –

Répondre

1

Mettez l'argument dans le champ clients:

object :user do 
    field :id, :id 
    field :email, :string 
    field :clients, list_of(:user) do 
    arg :order, type: :sort_order, default_value: :asc 
    resolve &Resolvers.clients/2 
    end 
end 

ensuite écrire un résolveur pour gérer le tri:

def clients(user, %{order: clients_order}, _) do 
    sorted_clients = user.clients # TODO sort those clients into the desired order 
    {:ok, sorted_clients} 
end