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
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)
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]>