Laravel:如何从DB中获取最后N个条目

时间:2014-07-21 08:47:29

标签: php database laravel laravel-4 eloquent

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

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

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

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

这样的东西

非常感谢您的帮助:)

10 个答案:

答案 0 :(得分:69)

您可以尝试这样的事情:

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

orderByDescending订单一起使用,并获取第一个n个记录。

答案 1 :(得分:7)

我的清洁解决方案是:

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

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

答案 2 :(得分:6)

Dogs::orderBy('created_at','desc')->take(5)->get();

答案 3 :(得分:3)

您也可以尝试这样:

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

在Laravel 5.6中它对我来说很好用

答案 4 :(得分:2)

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

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

这很好,因为您不使用orderBy,这在有大桌子时是不好的。

答案 5 :(得分:1)

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 实例,但似乎需要 {{ 1}} 实例)。 (见:https://github.com/laravel/framework/issues/35631

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

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

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

您只能像这样获得 id

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

我这样使用它,因为我觉得它更干净:

$covidUpdate = COVIDUpdate::latest()->take(25)->get();
相关问题