Ich verwende Absinth mit Elixier (Phoenix 1.3). Ich habe eine Blog-App, die Benutzer, Posts und Likes enthält, und die Likes werden mit einer Viele-zu-Viele-Beziehung zwischen Benutzern und Posts verknüpft.Hinzufügen von Aggregatfeldern zu Elixir graphql
Sagen wir, ich möchte sie auf dem Back-End eher als die Front aggregieren. Ich möchte :liked_by
einfach eine Zählung aller Gleichen sein, die vorhanden sind, eher wie field :likes, :int
, so dass ich wieder Antworten wie diese bekommen:
{
"data": {
"post" : {
"title" : "Title",
"content" : "This is the content",
"likes" : 7
}
}
}
Was würde mein Objekt muss aussehen? Ich möchte so etwas wie dies zu tun:
object :post do
field :id, :integer
field :title, :string
field :content, :string
field :likes, :integer, resolve: assoc(:liking_users, fn query, id, _ ->
query |> from like in MyApp.Content.Like, where: like.post_id == ^id, select: count("*")
)
end
EDIT # 1: Genauer gesagt, Ich mag würde wissen, wie eine anonyme Funktion im Absinth-Objekt zu parametrieren. Ich kann das Objekt erhalten eine nicht parametrisierte Wert leicht zurück:
field :somenumber, :integer, resolve: fn (_,_) -> {:ok, 15} end
Aber das Hinzufügen eines Parameters wie so
field :somenumber, :integer, resolve: fn (foo,_) -> {:ok, foo} end
gibt Folgendes zurück:
...
"somenumber": {},
...
Wie kann ich pass in ID des Objekts oder eine implizit zugeordnete Abfrage?
EDIT # 2: Ich habe eine Lösung gefunden, aber es fühlt sich sehr hacky.
object :post do
field :id, :integer
field :title, :string
field :content, :string
field :likes, :integer, resolve: fn (_,_,resolution) ->
{:ok, Post.getLikeCount(resolution.source.id) }
end
end
'Feld: Likes,: Ganzzahl, Auflösung: & Post.get_likes/3' mit einer benutzerdefinierten' Post.get_likes/3' Implementierung sollte tun. Weitere Informationen finden Sie unter "Absinthe.Schema.Notation.resolve" (https://hexdocs.pm/absinthe/Absinthe.Schema.Notation.html#resolve/1). – mudasobwa
@mudasobwa Näher kommen, siehe oben bearbeiten –
Sie müssen nicht assoc verwenden, setzen Sie einfach eine Funktion, die Integer gibt. Außerdem sollte assoc wahrscheinlich auch funktionieren. Hast du einen Fehler oder was? – mudasobwa