View Source Bind (bind v0.2.0)

Bind provides functionality to build dynamic Ecto queries based on given parameters. It allows developers to retrieve data flexibly without writing custom queries for each use case.

Examples

Given an Ecto schema module MyApp.User and a map of query parameters, you can build and run a query like this:

> params = %{ "name[eq]" => "Alice", "age[gte]" => 30, "sort" => "-age", "limit" => "10" }
> query = Bind.query(params, MyApp.User)
> results = Repo.all(query)
> IO.inspect(results)

Or, you can pipe:

> %{ "name[eq]" => "Alice", "age[gte]" => 30, "sort" => "-age", "limit" => "10" }
|> Bind.query(MyApp.User)
|> Repo.all()
|> IO.inspect()

If you're in a Phoenix controller:

def index(conn, params) do
  users = conn.query_string
    |> Bind.decode_query()
    |> Bind.query(MyApp.User)
    |> Repo.all()

render(conn, "index.json", users: users)

end

Summary

Functions

Merges additional filters with existing query params.

Maps over query parameters using field transformer functions.

Builds an Ecto query for the given schema based on the provided query string.

Functions

Link to this function

filter(query_string, filters)

View Source

Merges additional filters with existing query params.

Examples

# Only allow users to see their own posts
conn.query_string
  |> Bind.filter(%{"user_id[eq]" => current_user.id})
  |> Bind.query(Post)

# Scope to team and active status
params
  |> Bind.filter(%{"team_id[eq]" => team_id})
  |> Bind.filter(%{"active[true]" => true})
  |> Bind.query(Post)
Link to this function

map(query_string, field_mappers)

View Source

Maps over query parameters using field transformer functions.

Parameters

  • params: Map of query parameters (e.g. %{"user_id[eq]" => "123"})
  • field_mappers: Map of field names to transformer functions. Can contain atom keys for exact matches or regex patterns for flexible matching.

Examples

# Transform specific fields params = %{"user_id[eq]" => "123", "name[eq]" => "alice"} Bind.map(params, %{

 user_id: fn id -> HashIds.decode(id) end,
 name: &String.upcase/1

}) # => %{"user_id[eq]" => "u_123", "name[eq]" => "ALICE"}

# Transform multiple fields with regex pattern params = %{"user_id[eq]" => "123", "team_id[eq]" => "456"} Bind.map(params, %{

 ~r/_id$/i => fn id -> HashIds.decode(id) end

}) # => %{"user_id[eq]" => "u_123", "team_id[eq]" => "t_456"}

Note: Only transforms values for where conditions (e.g. [eq], [gte]). Other parameters like sort, limit etc. are preserved unchanged.

Builds an Ecto query for the given schema based on the provided query string.

Parameters

  • query_string: The query string from a URL.
  • schema: The Ecto schema module (e.g., MyApp.User).

Examples

> query_string = "?name[eq]=Alice&age[gte]=30&sort=-age&limit=10"
> Bind.query(query_string, MyApp.User)
#Ecto.Query<from u0 in MyApp.User, where: u0.name == ^"Alice", where: u0.age >= ^30, order_by: [desc: u0.age]>