首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ecto / Elixir:返回嵌套关联的第一个子关联

Ecto / Elixir:返回嵌套关联的第一个子关联
EN

Stack Overflow用户
提问于 2018-06-02 11:25:47
回答 1查看 268关注 0票数 2

我有一个Ecto查询,它几乎就在那里,但还不完全!

它返回与给定聊天相关的所有消息-但我只想返回每个聊天的第一条消息。

我尝试过使用子查询和片段,但似乎不能正确理解。

代码语言:javascript
复制
Repo.one!(
  from(
    p in Post,
    where: p.id == ^id,
    join: c in assoc(p, :chats),
    join: y in assoc(c, :messages),
    preload: [chats: {c, messages: y}]
  )
)
代码语言:javascript
复制
EN

回答 1

Stack Overflow用户

发布于 2018-06-09 03:55:32

代码语言:javascript
复制
defmacro last_message_id(chat_id) do
  quote do
    fragment("""
      (
        SELECT
          m.ID
        FROM
          MESSAGES m
        WHERE
          m.CHAT_ID = ?
        ORDER BY m.INSERTED_AT ASC
        LIMIT 1
      )
    """, unquote(chat_id))
  end
end

post = Repo.get(Post, id)

chats_with_last_message =
  post
  |> assoc(:chats)
  |> join(:inner, [c], m in Message, m.id == last_message_id(c.id)
  |> select([c, m], %{chat: c, message: m})
  |> Repo.all()

好了,这应该可以让你开始了。我在这里使用了两个查询,但可以使用this将其放入一个查询中。还要注意INNER加入,这意味着它会将聊天过滤为至少包含一条消息的聊天。

另外,我没有测试代码,但即使它不能工作,你也能理解。有更多时间的人可能会发布一个适当的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50653242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档