如何使用 Ecto/Phoenix select 来自数据库的最新条目

How to select the latest entry from database with Ecto/Phoenix

我刚开始使用数据库和查询(来自前端),我想 select 来自包含特定 title 的字段的最新条目,比如 Page1。我知道我有两个领域可以帮助我: 1) created_at - 我只能订购 select 最新的一个; 2) id - 我知道每个条目都会生成一个新的 id 所以我可以获得最大的 id; 我想将其应用于 "standard" 编辑控制器操作:

 def edit(conn, %{"id" => id}) do
    user = Repo.get(User, id)
    changeset = User.update_changeset(user)
    render(conn, "edit.html", user: user, changeset: changeset)
  end

所以我想知道哪种方法更好,并查看查询示例。

使用 id 字段取决于您的主键是否为整数。目前可能是这样,但会一直这样吗?您可以确定 inserted_at 将始终是一个时间字段 - 所以我会使用它。无论您使用哪种,请务必按降序排列,以便最新的排在最前面。

title = "Page 1"
query = Ecto.Query.from(e in Entry,
  where: e.title == ^title,
  order_by: [desc: e.inserted_at],
  limit: 1)
most_recent = Repo.one(query)

值得注意的是,在 Ecto 中 - 默认情况下插入时间被捕获为 inserted_at 而不是 created_at - 如果你有 created_field 那么你可以替换 inserted_at 在我的例子中。

也可以使用 Ecto 表达式语法来完成此操作,Ecto.Query.last/2 如下所示:

alias App.Entry
import Ecto.Query

Entry |> where(title: "Page 1") |> last(:inserted_at) |> Repo.one

请参阅 last/2 here 的文档!