我的数据库中有狗表,我想要检索 N latest added dogs
。
我发现的唯一方法就是这样:
Dogs:all()->where(time, <=, another_time);
还有另外一种方法吗?例如像Dogs:latest(5);
非常感谢您的帮助:)
答案 0 :(得分:69)
您可以尝试这样的事情:
$dogs = Dogs::orderBy('id', 'desc')->take(5)->get();
将orderBy
与Descending
订单一起使用,并获取第一个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();