Ecto.Query需要帮助编写带有表达式和动态查询的查询

时间:2018-05-17 17:53:45

标签: elixir psql ecto

我正在撰写查询以过滤付款。我们可以过滤付款名称,状态,日期,日期,金额和金额。我已经让所有查询都适用于所有人,但是数量和数量相等,因为它们更复杂并且涉及使用连接/子查询。

paymentpayment_method相关,其中包含已发送金额的信息。它是一对一的关系,payment通过funding_id引用payment_method的ID。

我需要能够过滤掉金额范围内的所有payments

以下是我需要帮助的查询部分:

def search(user_id, params) do
#MAIN QUERY
q = Payments.Schema
      |> where([user_id: ^user_id])
      |> where(^filter_name(params[:name]))
      |> where(^filter_status(params[:status]))
      |> where(^filter_date_from(params[:date_from]))
      |> where(^filter_date_to(params[:date_to]))
      |> join(:inner, ^filter_amount_from(params[:amount_from], params[:amount_to]))

#THIS FUNCTION DOESN'T CURRENTLY WORK  
defp filter_amount(amount_from, amount_to) when is_integer(amount_from) and is_integer(amount_to) do
    dynamic([t], t.funding_id in subquery(
        p = PaymentMethods.Schema
          |> where(p.amount >= ^amount_from)
          |> where(p.amount <= ^amount_to)
    ), t.funding_id = p.id)
  end
defp filter_amount(_amount_from, _amount_to), do: true

我目前在终端中收到此错误:

== Compilation error in file lib/users/payments/payments.ex ==
** (Ecto.Query.CompileError) unbound variable `p` in query

任何帮助将不胜感激!

更新

我已将代码更改为以下内容:

def search(user_id, params) do
    #MAIN QUERY
    q = Payments.Schema
          |> where([user_id: ^user_id])
          |> where(^filter_name(params[:name]))
          |> where(^filter_status(params[:status]))
          |> where(^filter_date_from(params[:date_from]))
          |> where(^filter_date_to(params[:date_to]))
          |> join(:inner, [t], p in subquery(^filter_amount(params[:amount_from], params[:amount_to]), t.funding_id == p.id))


defp filter_amount(amount_from, amount_to) when is_integer(amount_from) and is_integer(amount_to) do
    PullTransactions.Schema
        |> where(pt.amount >= ^amount_from)
        |> where(pt.amount <= ^amount_to)
end
defp filter_amount(_amount_from, _amount_to), do: true

我在终端中遇到的错误是:

cannot use ^filter_amount(params[:amount_from], params[:amount_to]) outside of match clauses

0 个答案:

没有答案