如何使用 Eloquent 范围获取最后一条记录?

How to get the last record using Eloquent scope?

我有一个 Posts table 结构如下:

现在我正在尝试获取最新的 post,这显然是 id = 2 的记录。

我的主题页面中有这个 posts.htm:

[builderList postLatest]
modelClass = "Me\Articles\Models\Posts"
scope = "scopeLatest"
scopeValue = "{{ :scope }}"
displayColumn = "title"
noRecordsMessage = "No records found"
detailsPage = "-"
detailsUrlParameter = "slug"
pageNumber = "{{ :page }}"

在我的模型中 Posts 我有:

public function scopeLatest($query)
{
  return $query->orderBy('created_at','desc')->first();
}

但是这个正在返回 两条记录。我也尝试使用 latest()

return $query->latest();

这一个给我错误:

Maximum function nesting level of '1000' reached, aborting!

甚至尝试像 latest('created_at') 一样传递参数,但得到了同样的错误。

尝试转储 dd($query->orderBy('created_at','desc')->first()->toSql()) 并得到 select * from posts where posts.deleted_at is null

  1. 为什么 first() 不限制为 1 条记录?
  2. 为什么 latest() 扔给我 Maximum error?这个版本是特定的错误吗?看来我找不到与之相关的文档。我有 Laravel 5.5.48.

我现在不确定我能用什么。也许我在这里做错了什么。我只需要获取最新的 post.

您的问题的解决方案是使用 ->take(1) method. There are more methods applicable to queries but here is the list of available methods 您可以在集合实例上 运行。我相信 Builder 期望范围 return 查询 {[a collection of models]}。我花了一些时间进行测试,在我看来这可能只是 Builder Plugin 构造中的一个缺陷。

现在在你看我下面的研究之前。我会说你应该像 Hardik 在评论中建议的那样学习构建你自己的 components。希望这对您有所帮助。

所以这是我的插件范围:

public function scopeFilterTypes($query) {
    return $query->whereNotIn('slug', [
        'range', 
        'close',
        'all', 
        'single',
        'three',
        'five',
        'self'
        ])->first();
}

这是我的后端表单的图片,它正确地只看到关系中的一个项目(这就是我使用范围的原因):

现在看看我的构建器组件的这张图片你可以看到它甚至忽略了我的 ->whereNotIn([]) 查询方法:

为了证明我对构建器组件中这个缺陷的发现,我做了一个 find($id) 方法,该方法将 return 一个模型实例而不是模型集合。使用 find($id) 方法也在后端表单中给出了正确的结果,但在 Builder 列表中显示了所有不正确的记录。

但是当我将范围更改为 ->take(1):

public function scopeFilterTypes($query) {
    return $query->whereNotIn('slug', [
        'range', 
        'close',
        'all', 
        'single',
        'three',
        'five',
        'self'
        ])->orderBy('created_at','desc')->take(1);
}

我在后端表单中得到了这个;正常工作:

我从构建器列表中得到这个: