簡體   English   中英

Elixir + Absinthe + Ecto + Dataloader – 按多個字段過濾

[英]Elixir + Absinthe + Ecto + Dataloader – filter by multiple fields

使用 Elixir/Absinthe/Ecto/Dataloader,如何通過多個字段查詢/過濾源?

例子:

假設您希望通過兩個字段過濾名為User的模式(和數據加載器源),一個名為is_admin (只有true值)和一個group_id可以是列表中的任何值,例如[1, 5, 9]

使用Dataloader看起來如何?

這是來自架構定義:

alias App.Data

# ...

object :app do
  field :users, list_of(:user) do
    resolve fn app, _args, %{context: %{loader: loader}} ->

      params = [is_admin: true, group_id: [1,2,3]]

      loader
      |> Data.load_many(:users, params)
      |> on_load(fn loader ->
        {:ok, Data.get_many(loader, :user, params)}
      end)
    end
  end
end

這是數據源模塊:

defmodule App.Data do
  alias App.User

  def data do
    Dataloader.Ecto.new(Repo, run_batch: &run_batch/5)
  end

  def load_many(loader, :users, [is_admin: is_admin, group_id: ids]) do
    Dataloader.load(loader, __MODULE__, {:many, {User, is_admin: is_admin}}, group_id: ids)
  end

  def get_many(loader, :users, [is_admin: is_admin, group_id: ids]) do
    Dataloader.load(loader, __MODULE__, {:many, {User, is_admin: is_admin}}, group_id: ids)
  end

  def run_batch(queryable, query, col, inputs, repo_opts) do
    Dataloader.Ecto.run_batch(Repo, queryable, query, col, inputs, repo_opts)
  end
end

因此,要回答我自己的問題,有效的解決方案是利用 Dataloader 的&query/2 ,因此 GQL 解析器中的解析器基本上如下所示:

loader
|> Data.load({:many, User, group_ids: ids}, is_admin: true)
|> on_load(fn loader ->
   loader
   |> Data.get({:many, User, group_ids: ids}, is_admin: true)
   # ...
end)

... App.Data模塊中的query/2方法如下所示:

defp query(User, %{group_ids: ids}) do
   from u in User, where: u.group_id in ^ids
end

這在這里解釋:

https://hexdocs.pm/lazyloader/Dataloader.Ecto.html#module-filtering-ordering

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM