【问题标题】:How do I return last n records in the order of entry如何按输入顺序返回最后 n 条记录
【发布时间】:2015-02-02 02:25:36
【问题描述】:

来自Laravel 4 and Eloquent ORM - How to select the last 5 rows of a table,但我的问题有点不同。

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

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

first
second
third
fourth
fifth

我希望查询返回最后 2 条记录

fourth
fifth

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    Laravel 偏移量

    DB::table('users')->skip(<NUMBER Calulation>)->take(5)->get();

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

    $query = User::all();
    $count = ($query->count()) - 5;
    
    $query = $query->skip($count)->get();
    

    【讨论】:

    • 非常感谢。这对性能有重大影响吗?
    • 不,因为您已经在进行完全相同的查询。只需添加它。我在我的代码中包含了一个示例。记住只是在查询之上构建而不是对数据库进行 2 次查询
    • @Rafael 您的第二个示例实际上运行了 2 个查询。首先,获取所有记录,然后在使用 skip 时再次获取。
    • :|是的,我想是的。但这是唯一的方法。
    • @Rafael 是的。看我的回答
    【解决方案2】:

    在纯 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();
    

    如果你使用 Eloquent:

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

    注意latestoldest只需分别添加orderBy('created_at)descasc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-21
      • 2018-02-27
      • 1970-01-01
      • 2015-04-29
      • 2018-03-20
      • 1970-01-01
      • 2014-03-31
      • 2016-02-14
      相关资源
      最近更新 更多