使用Ecto v2.2.6,Phoenix 1.3
我有一个带有新闻源的博客应用。它的工作原理如下:
我想使用Ecto.Query从给定用户关注的用户那里获取新闻源项目列表。
快速背景。以下是对象:
mix phx.gen.json Accounts User users email:string password:string
mix phx.gen.json Content Post posts title:string content:string user_id:references:users
(users
和posts
有has_many:
和belongs_to:
的关系。)
mix phx.gen.json Accounts Follow follows following_id:references:users followed_id:references:users
(当用户A跟随用户B时,会创建一个新的Follow
条目,其中following_id
指向A,followed_id
指向B。)
mix phx.gen.json Content Newsfeeditem newsfeeditems type:string, user_id:integer, content:string
现在我想查询这些东西。要让我获得给定用户的Newsfeeditems
列表,这很简单:
导入Ecto.Query
query =
from n in Newsfeeditem,
where: n.user_id == ^user_id
我们说我是用户1,我关注的是用户2,3和4. follows
表中有三个条目。要为这些用户获取所有相应的newsfeeditems,查询将如下所示:
query =
from n in Newsfeeditem,
where: n.user1_id in [2,3,4]
我想让它充满活力。在这里,我迷失了。我想做一些类似于此的事情:
subquery =
from f in Follow,
where: f.following_id == 1,
select: f.follower_id
query =
from n in Newsfeeditem,
where: n.user_id in (Repo.all(subquery))
显然这不起作用,但我不确定如何正确构建这些东西。
如何通过子查询选择此项? (注意我特意寻找子查询解决方案,但如果有更好的方法则可以获得奖励积分)
答案 0 :(得分:2)
Subquerys are currently not allowed in where
clauses; the documentation recommends using a JOIN instead.您的查询可以很容易地转换为JOIN。我还没有对它进行测试,但这应该可行:
noexcept