# Bind
Flexible and dynamic Ecto query builder for Elixir applications, allowing developers to retrieve data flexibly without writing custom queries for each use case.
## Installation
Add `bind` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:bind, "~> 0.1.0"}
]
end
```
## API
```ex
Bind.query(schema, params)
```
Parameters:
- `schema`: The Ecto schema module (e.g., `MyApp.User`).
- `params`: Either a map of query parameters or a query string.
Returns: An Ecto query.
## Usage Example
Create Ecto query:
```ex
query = Bind.query(MyApp.User, %{ "name[eq]" => "Alice", "age[gte]" => 30 })
```
Alternatively, with a query string:
```ex
query = Bind.query(MyApp.User, "?name[eq]=Alice&age[gte]=30")
```
And finally run the query to get results from the database:
```ex
results = Repo.all(query)
```
### Filtering
Example:
```ex
Bind.query(%{"name[eq]" => "Alice", "age[gte]" => 30})
```
Bind supports various comparison operators for filtering:
- `eq`: Equal to
- `neq`: Not equal to
- `gt`: Greater than
- `gte`: Greater than or equal to
- `lt`: Less than
- `lte`: Less than or equal to
- `true`: Boolean true
- `false`: Boolean false
- `starts_with`: String starts with
- `ends_with`: String ends with
- `in`: In a list of values
- `contains`: String contains
- `nil`: Is nil (or is not nil)
### Sorting
Use the `sort` parameter to specify sorting order:
- Prefix with `-` for descending order
- No prefix for ascending order
```ex
params = %{"sort" => "-age"} # Sort by age descending
```
### Pagination
- `limit`: Specify the maximum number of results (default: 10)
- `start`: Specify the starting ID for pagination
Example:
```ex
params = %{"limit" => 20, "start" => 100}
```
### Query String Support
Bind can also pass URL query strings:
```ex
query_string = "?name[eq]=Alice&age[gte]=30&sort=-age&limit=10"
query = Bind.query(MyApp.User, query_string)
```