elixir - 我可以在 Ecto 中使用其中一个关联的聚合计数来查询模型吗?

标签 elixir phoenix-framework ecto

是否可以编写一个查询,该查询返回所有模型(即 Post)及其关联之一(即 Like)的聚合计数。

Repo.all(from p in Post, 
    join: l in Like, 
    where l.post_id == p.id,
    group_by: p.id,
    select: {p, count(l.id)

我试过使用 group_by 和 select(上面),但这只是部分有效。查询结果排除了所有没有点赞的帖子。

如果这是不可能的,那么处理这个问题的最佳方法是什么?首先想到的是对查询结果进行映射,如下所示:
posts = 
    Repo.all Post
    |> Enum.map(fn(post) ->
        likes_query = from l in Like, where: l.post_id == ^post.id
        likes_count = Repo.aggregate(likes_query, :count, :id)

        %{post: post, likes_count: likes_count}
     end)

最佳答案

查询有两处错误:

  • 您需要使用 on而不是 where指定连接条件
  • 您需要使用 left_join而不是 join如果您希望没有点赞的帖子被退回。

  • 最终查询:
    from p in Post, 
      left_join: l in Like, 
      on: l.post_id == p.id,
      group_by: p.id,
      select: {p, count(l.id)}
    

    您也可以使用 assocleft_join这里将添加正确的 on自动地:
    from p in Post, 
      left_join: l in assoc(p, :likes), 
      group_by: p.id,
      select: {p, count(l.id)}
    

    关于elixir - 我可以在 Ecto 中使用其中一个关联的聚合计数来查询模型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42801543/

    相关文章:

    mongodb - 如何将 Phoenix Framework 与 Mongodb 结合使用?

    postgresql - 无法混合 ecto.create,角色 'postgres' 不存在

    elixir - has_one 在 ecto/phoenix/elixir 中没有belongs_to

    elixir - Ecto:将 %Plug.Upload 转换到虚拟字段以进行文件上传验证

    elixir - Phoenix JSON-API 序列化仅在创建后的显示操作中获取 Ecto.Association.NotLoaded

    datetime - 如何在 Elixir 中将字符串转换为 Ecto.DateTime?

    elixir - 输出为 ecto 迁移生成的 DDL

    elixir - 使用 shell 脚本调用 Elixir 方法

    elixir - 如何获得列表的排列?

    spring-boot - 了解 Elixir