首页 > 解决方案 > 如何使用 Eloquent 范围获取最后一条记录?

问题描述

我有一个Posts结构如下的表:

在此处输入图像描述

现在我正在尝试获取最新的帖子,这显然是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。

我现在不确定我可以使用什么。也许我在这里做错了什么。我只需要获取最新的帖子。

标签: laravel-5eloquentoctobercms

解决方案


您的问题的解决方案是使用->take(1) 方法。还有更多适用于查询的方法,但这里列出了可以在集合实例上运行的可用方法。我相信 Builder 期望范围返回一个 query {[a collection of models]}。我花了一些时间进行测试,在我看来这可能只是 Builder Plugin 构造中的一个缺陷。

现在,在你看下面我的研究之前。我想说你应该学习构建自己的组件,就像 Hardik 在评论中建议的那样。希望这一切都有帮助。

所以这是我的插件范围:

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

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

在此处输入图像描述

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

在此处输入图像描述

为了证明我对构建器组件中这个缺陷的发现,我做了一个find($id)方法,它会返回一个模型实例而不是模型的集合。使用该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);
}

我在后端表单中得到这个;正常工作: 在此处输入图像描述

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

在此处输入图像描述


推荐阅读