我的DB中有一个dogs表,我想检索N latest added dogs
。
我发现的唯一方法是这样的:
Dogs:all()->where(time, <=, another_time);
有其他方法吗?例如像这样的Dogs:latest(5);
非常感谢您的帮助:(
您可以尝试以下操作:
$dogs = Dogs::orderBy('id', 'desc')->take(5)->get();
使用orderBy
和Descending
顺序,并获取记录的第一个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();
该代码返回集合中的最新记录