如何使用 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
- 为什么
first()
不限制为 1 条记录?
- 为什么
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);
}
我在后端表单中得到了这个;正常工作:
我从构建器列表中得到这个:
我有一个 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
- 为什么
first()
不限制为 1 条记录? - 为什么
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);
}
我在后端表单中得到了这个;正常工作:
我从构建器列表中得到这个: