Laravel 如何按输入顺序返回最后n条记录

Laravel 如何按输入顺序返回最后n条记录,laravel,eloquent,Laravel,Eloquent,是的,但我的问题有点不同 如何返回按创建方式排序的最后N条记录(ASC) 例如,以下记录按顺序插入: first second third fourth fifth 我想要一个返回最后2条记录的查询 fourth fifth 拉维偏移量 DB::table('users')->skip()->take(5)->get() 您可以通过获取当前查询的计数并跳过$query->count()-5以获取最后5条记录或您想要的任何内容来计算N 前 在纯SQL中,这是通过使用子查询来完成的。大概是这样的

是的,但我的问题有点不同

如何返回按创建方式排序的最后N条记录(ASC)

例如,以下记录按顺序插入:

first
second
third
fourth
fifth
我想要一个返回最后2条记录的查询

fourth
fifth

拉维偏移量

DB::table('users')->skip()->take(5)->get()

您可以通过获取当前查询的计数并跳过$query->count()-5以获取最后5条记录或您想要的任何内容来计算N


在纯SQL中,这是通过使用子查询来完成的。大概是这样的:

SELECT * FROM (
    SELECT * FROM foo
    ORDER BY created_at DES
    LIMIT 2
) as sub
ORDER BY created_at ASC
因此,限制发生在子查询中,然后在主查询中,顺序被颠倒。Laravel实际上不支持子查询。但是,您仍然可以这样做:

$sub = DB::table('foo')->latest()->take(2);
$result = DB::table(DB::raw('(' . $sub->toSql() . ') as sub'))
            ->oldest()
            ->get();
如果你使用雄辩的语言:

$sub = Foo::latest()->take(2);
$result = Foo::from(DB::raw('(' . $sub->toSql() . ') as sub'))
             ->oldest()
             ->get();

注意最新的
和最老的只需分别添加一个带有
desc
asc
orderBy('created_at)

非常感谢。这是否会对性能产生重大影响?完全不会,因为您将进行完全相同的查询。再加上。我在代码中包含了一个示例。请记住,只需在查询的基础上进行构建,而不是对DB@Rafael您的第二个示例实际上运行了2个查询。首先,获取所有记录,然后再次使用
跳过
:|是的,我想是吧。但这是唯一的办法。@Rafael,是的。看到我的答案了吗
$sub = Foo::latest()->take(2);
$result = Foo::from(DB::raw('(' . $sub->toSql() . ') as sub'))
             ->oldest()
             ->get();