Ecto 'where and where' 子句

Ben*_*ins 2 elixir ecto

我想选择名称为 xxx 且品牌为 xxx 的单个记录(整条记录)。该记录将始终是单数,因为名称和品牌是唯一索引:

  def getProductByNameAndBrand(name, brand) do
    IO.puts("getProductByNameAndBrand")
    IO.inspect(name)
    IO.inspect(brand)
    from p in Api.Product, 
    where: [name: ^name], 
    where: [brand: ^brand]
    select %{id: p.id, name: p.name, brand: p.brand}
  end
Run Code Online (Sandbox Code Playgroud)

这是抛出:

== Compilation error on file lib/api/repo.ex ==
** (CompileError) lib/api/repo.ex:278: undefined function p/0
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种语法:

  def getProductByNameAndBrand(name) do
    Api.Product |> Ecto.Query.where(name: ^name) |> all
  end
Run Code Online (Sandbox Code Playgroud)

但是不确定是否可以以这种方式完成?

我究竟做错了什么?

编辑:很确定这以所需的方式工作,但仍会在此处发布以验证它没有错误:

  def getProductByNameAndBrand(name, brand) do
    Api.Product |> Ecto.Query.where(name: ^name) |> Ecto.Query.where(brand: ^brand) |> all
  end
Run Code Online (Sandbox Code Playgroud)

Pat*_*wak 5

在使用 second 之后的查询语法编写的查询中where,您错过了逗号。其余代码看起来不错。在最新的 Ecto 版本中,or_where如果您想对where表达式应用 OR 子句而不是 AND ,您也可以使用。