ChatGPT解决这个技术问题 Extra ChatGPT

Laravel:如何从数据库中获取最后 N 个条目

我的数据库中有狗表,我想检索 N latest added dogs

我发现的唯一方法是这样的:

Dogs:all()->where(time, <=, another_time);

还有另一种方法吗?例如像这样的 Dogs:latest(5);

非常感谢您的帮助:)

orderBy()limit() 方法的组合;虽然您也有 latest() 作为 orderBy() 的替代品

T
The Alpha

你可以尝试这样的事情:

$dogs = Dogs::orderBy('id', 'desc')->take(5)->get();

orderByDescending 顺序一起使用并获取前 n 条记录。

更新(由于添加了 latest 方法):

$dogs = Dogs::latest()->take(5)->get();

如果在这种情况下只有 3 条记录会发生什么?
你会得到三个:-)
这将反转您的项目的顺序。您将不得不在您的应用程序中重新排序它们。因此,如果您尝试加载按日期排序的最后 5 个帖子,请不要忘记在集合级别重新排序。
p
parker_codes

我的清洁解决方案是:

Dogs::latest()->take(5)->get();

它与其他答案相同,只是使用内置方法来处理常见做法。


这也适用于 UUID,因此更通用。但它不适用于没有时间戳的表。
L
Luca C.
Dogs::orderBy('created_at','desc')->take(5)->get();

J
João Marcus

您可以传递一个负整数 n 来获取最后 n 个元素。

Dogs::all()->take(-5)

这很好,因为您不使用 orderBy,这在您有一张大桌子时很糟糕。


不保证最后 5 个结果是最后插入的 5 个。它通常有效,但没有保修
我没有成功使用它。对我来说 -5 和 5 是一样的!!!
B
Bablu Ahmed

你也可以这样尝试:

$recentPost = Article::orderBy('id', 'desc')->limit(5)->get();

在 Laravel 5.6 中对我来说工作正常


是的,方法 takelimit 是相似的。父级是 limit,而 take 只是别名。您可以检查文件 Builder.php
h
hackernewbie

我以这种方式使用它,因为我发现它更干净:

$covidUpdate = COVIDUpdate::latest()->take(25)->get();

k
kray

我想出了一个解决方案,可以帮助我使用 array_slice() 方法获得相同的结果。在我的代码中,我使用 -5 执行了 array_slice( PickupResults::where('playerID', $this->getPlayerID())->get()->toArray(), -5 );,我想要查询的最后 5 个结果。


M
Michael Engelbrecht

The Alpha 的解决方案非常优雅,但有时您需要使用 SQL 重新排序(升序)数据库中的结果(以避免在集合级别进行内存排序),并且SQL 子查询是实现此目的的好方法。

如果 Laravel 足够聪明,如果我们使用以下理想代码能够识别出我们想要创建子查询,那就太好了……

$dogs = Dogs::orderByDesc('id')->take(5)->orderBy('id')->get();

...但这会被编译为具有冲突 ORDER BY 子句的单个 SQL 查询,而不是在这种情况下所需的子查询。

不幸的是,在 Laravel 中创建子查询并不像下面的伪代码那么简单,使用起来真的很好......

$dogs = DB::subQuery( 
    Dogs::orderByDesc('id')->take(5) 
)->orderBy('id');

...但是使用以下代码可以实现相同的结果:

$dogs = DB::table('id')->select('*')->fromSub(
    Dogs::orderByDesc('id')->take(5)->toBase(), 
    'sq'
)->orderBy('id');

这会生成所需的 SELECT * FROM (...) AS sq ... sql 子查询构造,并且代码在可读性方面合理干净。)

请特别注意 ->toBase() 函数的使用 - 这是必需的,因为 fromSub() 不喜欢使用 Eloquent 模型 Eloquent\Builder 实例,但似乎需要 Query\Builder 实例)。 (见:https://github.com/laravel/framework/issues/35631

我希望这对其他人有所帮助,因为我只是花了几个小时研究如何自己实现这一目标。 (我有一个复杂的 SQL 查询构建器表达式,在某些情况下需要限制为最后几行)。


D
Dharman

想象这样一种情况,您想从刚刚插入数据库的请求标头中获取最新的数据记录:

$noOfFilesUploaded = count( $request->pic );// e.g 4
$model = new Model;

$model->latest()->take($noOfFilesUploaded); 

这样,您的 take() 辅助函数将获取刚刚通过请求发送的数组数据的数量。

您只能像这样获得 id

$model->latest()->take($noOfFilesUploaded)->puck('id')


M
Mosaib Khan

从数据库获取最后一个条目

$variable= Model::orderBy('id', 'DESC')->limit(1)->get();


R
RJH
use DB;

$dogs = DB::select(DB::raw("SELECT * FROM (SELECT * FROM dogs ORDER BY id DESC LIMIT 10) Var1 ORDER BY id ASC"));

您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以在 help center 中找到有关如何写出好的答案的更多信息。