是否可以合并两个单独的ecto查询?

问题描述 投票:4回答:2

我想知道是否可以在ecto中将两个查询组合在一起。

我想创建一个函数,它接受一个ecto查询并根据具体情况修改它。

例如,让我们假设我们有一个users表,允许输入重复的usernames,用户创建以下查询...

query = from(u in "users", select: u)
select_all_unique_users(query)

我希望select_all_unique_users函数采用query并添加到它,以便它只选择不同的用户名。

这只是一个例子,我知道我可以在桌子上创建一个unique_index以避免这在现实= D

由于query是引擎盖下的结构,我想我可以更新distinct键这样做。这似乎有效,但缺点是它看起来不太灵活,如果我想添加更复杂的逻辑,它看起来很难实现。

简单地说,我想要做的是创建一个接受查询的函数,并为它添加更多逻辑......

iex()> query = from(u in "users", select: u)
#Ecto.Query<from u0 in "users", select: u0>

iex()> select_all_unique_users(query)
#Ecto.Query<from u0 in "users", distinct: [asc: u0.username], select: u0>
elixir ecto
2个回答
1
投票

select_all_unique_users函数将实现如下:

defmodule TestModule do
  def select_all_unique_users(q) do
    from u in q, distinct: u.username
  end
end

你可以像下面这样使用它:

iex(2)> query = from(u in "users", select: u)
#Ecto.Query<from u in "users", select: u>

iex(3)> distinct = TestModule.select_all_unique_users(query)
#Ecto.Query<from u in "users", distinct: [asc: u.username], select: u>

我将select_all_unique_users包装在我为此答案创建的模块中,但您可以将它放在您认为合适的任何模块中。


1
投票

你当然可以!

你可以像这样去做,假设你有这样的select_all_unique_users/1函数:

def select_all_unique_users(query) do
  from(u in query, distinct: u.username)
end

应该做的伎俩。那么,你可以这样做:

# using a defined User schema is preferred over "users". Using
# "users" might cause an error for not being able to sellect all fields
# from table without a schema

iex> q = from(u in User, select: u)
#Ecto.Query<from u in User, select: u>
iex> select_all_unique_users(q)
#Ecto.Query<from u in User, distinct: [asc: u.username], select: u>

请注意,来自select_all_unique_users/1的查询没有另一个select语句。这是因为只允许一个select表达式。因此,如果您想在不同的查询中选择不同的属性,您可能希望在select_all_unique_users/1或任何其他基于from(u in User)的函数中添加它们

© www.soinside.com 2019 - 2024. All rights reserved.