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


Laravel: How to get last N entries from DB

我的DB中有一个dogs表,我想检索N latest added dogs

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

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

有其他方法吗?例如像这样的Dogs:latest(5);

非常感谢您的帮助:(

您可以尝试以下操作:

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

使用orderByDescending顺序,并获取记录的第一个n编号。

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

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

我的清洁解决方案是:

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

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

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

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

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

这很好,因为您不使用orderBy,当您有一个大表时,这很糟糕。

您也可以这样尝试:

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

它在Laravel 5.6 中运行良好

我这样使用它,因为我发现它更干净:

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

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

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

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

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

但它被编译为具有冲突CCD_ 10子句的单个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查询生成器表达式,在某些情况下需要限制在最后几行(。

用于从DB 获取最后一个条目

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

可以使用此latest():

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

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

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

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

你只能得到类似的id

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

use DB;
$dogs = DB::select(DB::raw("SELECT * FROM (SELECT * FROM dogs ORDER BY id DESC LIMIT 10) Var1 ORDER BY id ASC"));
Dogs::latest()->take(1)->first();

该代码返回集合中的最新记录