我遇到了一个优化问题,需要从有大量记录的数据库中获取n latest
结果。我知道我可以通过使用orderBy
来做到这一点,但我想避免它,因为orderBy
在每个记录中循环,这增加了我的负载&查询时间。我在take()
中找到了一个使用负数的答案,它基本上会获取最新记录,但对我来说不起作用,它会获取所有记录:
Record::all()->take(-5);
这是上一个代码的输出,它只返回空的Query Builder
实例:
"supplementRecommendationsHistory" => IlluminateDatabaseEloquentBuilder {#2485 ▼
#query: IlluminateDatabaseQueryBuilder {#2484 ▶}
#model: AppRecommendedSupplement {#2483 ▶}
#eagerLoad: array:2 [▶]
#localMacros: []
#onDelete: null
#passthru: array:17 [▶]
#scopes: []
#removedScopes: []
}
对此有不同的方法吗?感谢您的帮助。
根据评论(@Justinas(的建议,我就是这样实现WHERE id > :{nextIndex - N}
解决方案的:
RecommendedTest::where('id', '>', RecommendedTest::max('id') - 20)->get()->reverse()->values();
通过这种方式,我可以从一个巨大的数据库中获取最新的20条记录。我还使用reverse()->values()
来恢复结果的顺序,这基本上给了我按created_at列排序的结果,这是我的初始目标。查询时间不长,大约为1000ms,这对我来说还可以,因为这是临时解决方案。
反向和数值方法的文件