我刚开始使用数据库和查询(来自前端),我想从包含特定title
的字段中选择最新条目,比如说Page1
。我知道我有两个可以帮助我的领域:
1)created_at
- 我可以订购它只选择最新的一个;
2)id
- 我知道每个条目都会生成一个新的id
,因此我可以获得最大的id
;
我想将它应用到"标准"编辑控制器动作:
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
所以我想知道哪种方法更好,并查看查询示例。
答案 0 :(得分:5)
使用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
在我的例子中。
答案 1 :(得分:1)
使用Ecto表达式语法和Ecto.Query.last/2
也可以这样做:
alias App.Entry
import Ecto.Query
Entry |> where(title: "Page 1") |> last(:inserted_at) |> Repo.one
查看last/2
here的文档!