Ecto - 根据关联查询 table
Ecto - querying a table based on an association
我有以下表格:
schema "project_users" do
belongs_to(:user, MyApp.User)
end
和
schema "users" do
field(:search_vector, :tsvector)
end
我想在查询users
后根据search_vector
的结果查询project_users
,与belongs_to
有belongs_to
关系
我对 users
有以下查询。我想知道如何将它与 project_users
:
联系起来
def query_all_users(params \ %{}, preload \ []) do
query = from(u in User, preload: ^preload)
query_by(query, params)
end
defp query_by(query, %{"keyword" => keyword} = params) do
query = from(q in query, where: fragment("search_vector @@ plainto_tsquery(?)", ^keyword))
query_by(query, Map.delete(params, "keyword"))
end
如果我没看错,你需要 has_one
/has_many
关系 users
到 project_users
。
更新架构 users
:
schema "users" do
field(:search_vector, :tsvector)
has_one :project_user, ProjectUser # <---
end
并使用preload
函数:
query |> preload(:project_user)
我建议创建一个执行连接然后过滤的查询:
defmodule ProjectUser do
use Ecto.Schema
import Ecto.Query
schema "project_users" do
belongs_to :user, User
end
@spec by_search_vector(Ecto.Queryable.t, String.t) :: Ecto.Query.t
by_search_vector(query, search_vector) do
from pu in query,
join: u in assoc(pu, :user),
where: fragment("? @@ plainto_tsquery(?)", u.search_vector, ^search_vector)
end
end
这应该很容易缩小项目用户的范围。
我有以下表格:
schema "project_users" do
belongs_to(:user, MyApp.User)
end
和
schema "users" do
field(:search_vector, :tsvector)
end
我想在查询users
后根据search_vector
的结果查询project_users
,与belongs_to
有belongs_to
关系
我对 users
有以下查询。我想知道如何将它与 project_users
:
def query_all_users(params \ %{}, preload \ []) do
query = from(u in User, preload: ^preload)
query_by(query, params)
end
defp query_by(query, %{"keyword" => keyword} = params) do
query = from(q in query, where: fragment("search_vector @@ plainto_tsquery(?)", ^keyword))
query_by(query, Map.delete(params, "keyword"))
end
如果我没看错,你需要 has_one
/has_many
关系 users
到 project_users
。
更新架构 users
:
schema "users" do
field(:search_vector, :tsvector)
has_one :project_user, ProjectUser # <---
end
并使用preload
函数:
query |> preload(:project_user)
我建议创建一个执行连接然后过滤的查询:
defmodule ProjectUser do
use Ecto.Schema
import Ecto.Query
schema "project_users" do
belongs_to :user, User
end
@spec by_search_vector(Ecto.Queryable.t, String.t) :: Ecto.Query.t
by_search_vector(query, search_vector) do
from pu in query,
join: u in assoc(pu, :user),
where: fragment("? @@ plainto_tsquery(?)", u.search_vector, ^search_vector)
end
end
这应该很容易缩小项目用户的范围。