如何在Ecto中编写where子句

霍拉西奥

我必须过滤一个在某些情况下可以接受逗号分隔值的索引。我在Ecto工作,没有凤凰(和牛仔一起)。

我的索引将支持这样的搜索

/users?ids=1,2,3&[email protected]&another=something

其中电子邮件字段不允许使用多个参数,并且ID支持多个ID

这就是我尝试过的

def list_all(query_params) do
    filtered_params = prepare_list_query(query_params)

    User
    |> where(^filtered_params)
    |> Repo.all()
  end

  # In order to simplify queries I decided to manage all queries as IN clause
  # it will returns [id: [1,2,3], email:["[email protected]"]]

  defp prepare_list_query(query_params) do
    query_params
    |> Map.take(~w(ids email another))
    # Careful: read reference #1 above
    |> Enum.map(fn {name, value} ->
      case name do
        "ids" -> {:id, String.split(value, ",")}
        single_param -> {String.to_atom(single_param), [value]}
      end
    end)
  end

这很棘手,但我的想法是返回

[id: [1,2,3], email:["[email protected]"]]

然后将所有过滤器用作IN子句。

该过滤器必须支持发送零个,一个或所有参数。

我是长生不老药世界中的全新人,我正在迈出第一步。

提前致谢 :)。

巴杜

您可以用来Enum.reduce/3根据参数动态构建ecto查询

def list_all(query_params) do
    query = User # initial query

    query_params
    |> Map.take(~w(ids email another))
    |> Enum.reduce(query, fn 
      {_key, value} when value in [nil, ""], q ->
          q # ignore empty values          
      {"ids", value}, q -> 
          ids = String.split(values, ",")
          q |> where([r], r.id in ^ids) 
      {key, value} ->
          args = [{key, value}] 
          q |> where(^args)
      end
    end)
    |> Repo.all()
  end

在reduce函数中,您可以添加新子句来处理不同的键和值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在ecto中从from子句编写复杂的子查询?

如何在JOOQ中编写OPTIONAL where子句

如何在 Where 子句条件中编写动态删除条件

如何在where子句的ecto查询中使用变量

如何在Silverstripe 4中使用IN子句编写查询WHERE

如何在Laravel 5和查询生成器中编写“ OR WHERE YEAR(...)”子句?

如何在C#中使用Entity Framework中的where子句编写SQL更新查询

如何在Google工作表中编写where子句来评估不同工作表的值?

如何在SQL Server中的数据透视表语句中编写where子句

如何在单个 LinQ 查询中编写 OrderByDescending 和 where 子句

如何在where子句中编写多级条件

Laravel-如何在where子句中编写多个条件?

如何使用Ecto构建WHERE IN数组子句?

如何在python中实现where子句

如何在Eloquent中组合WHERE子句

如何在sqlite中为连接表编写where子句并获取所有已删除的联系人= 0

如何在 Sequelize 连接中编写自定义 on 子句

如何在EF中包含的实体中添加where子句?

如何在 linq 或 lambda 中使用 join 和 where 子句编写 sql 查询

如何在WHERE子句中使用SELECT语句编写SQL DELETE语句?

如何在MDX where子句中编写日期过滤器?

如何在Hibernate @ManyToMany关系中添加where子句?

如何在LINQ中动态添加或删除where子句

如何在 linq 中添加多个 where 子句?

如何在Cypher中的COUNT上执行WHERE子句?

如何在GORM中动态设置where子句

PostgreSQL WHERE 子句如何在此查询中工作?

PostgreSQL:如何在查询中合并WHERE子句

如何在Laravel关系中添加where子句?