【问题标题】:Laravel: How to get last N entries from DBLaravel:如何从数据库中获取最后 N 个条目
【发布时间】:2014-09-11 17:09:30
【问题描述】:

我的数据库中有狗表,我想检索 N latest added dogs

我找到的唯一方法是这样的:

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

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

非常感谢您的帮助:)

【问题讨论】:

  • orderBy()limit() 方法的组合;虽然你也有latest() 作为orderBy() 的替代品

标签: php database laravel laravel-4 eloquent


【解决方案1】:

你可以试试这样的:

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

使用orderByDescending 顺序并获取第一个n 记录数。

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

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

【讨论】:

  • 这种情况下如果只有3条记录会怎样?
  • 你会得到三个 :-)
  • 这将反转您的项目的顺序。您将不得不在您的应用程序中重新排序它们。因此,如果您尝试加载按日期排序的最后 5 个帖子,请不要忘记在集合级别重新排序。
【解决方案2】:

我的清洁解决方案是:

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

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

【讨论】:

  • 这也适用于 UUID,因此它更通用。但它不适用于没有时间戳的表。
【解决方案3】:
Dogs::orderBy('created_at','desc')->take(5)->get();

【讨论】:

    【解决方案4】:

    你也可以这样尝试:

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

    在 Laravel 5.6 中对我来说工作正常

    【讨论】:

    • 是的,takelimit 方法类似。父级是limittake 只是别名。您可以检查文件 Builder.php
    【解决方案5】:

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

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

    这很好,因为你不使用 orderBy,当你有一张大桌子时这是不好的。

    【讨论】:

    • 不保证最后 5 个结果是最后插入的 5 个。它通常有效,但没有保修
    • 我没有成功使用它。对我来说 -5 和 5 是一样的!!!
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      如果 Laravel 足够聪明,如果我们使用以下 ideal 代码来识别我们想要创建子查询,那就太好了...

      $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 子查询构造,并且代码在可读性方面合理干净。)

      请特别注意 -&gt;toBase() 函数的使用 - 这是必需的,因为 fromSub() 不喜欢使用 Eloquent 模型 Eloquent\Builder 实例,但似乎需要 Query\Builder 实例)。 (见:https://github.com/laravel/framework/issues/35631

      我希望这对其他人有所帮助,因为我自己花了几个小时研究如何实现这一目标。 (我有一个复杂的 SQL 查询构建器表达式,在某些情况下需要限制为最后几行)。

      【讨论】:

        【解决方案8】:

        我用这种方式,因为我觉得它更干净:

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

        【讨论】:

          【解决方案9】:

          想象一下,你想从刚刚插入数据库的请求头中获取最新的数据记录:

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

          这样,您的 take() 辅助函数会获取刚刚通过请求发送的数组数据的数量。

          你只能像这样得到ids:

          $model-&gt;latest()-&gt;take($noOfFilesUploaded)-&gt;puck('id')

          【讨论】:

            【解决方案10】:

            从数据库中获取最后一个条目

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

            【讨论】:

              【解决方案11】:
              use DB;
              
              $dogs = DB::select(DB::raw("SELECT * FROM (SELECT * FROM dogs ORDER BY id DESC LIMIT 10) Var1 ORDER BY id ASC"));
              

              【讨论】:

              • 您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以在help center找到更多关于如何写好答案的信息。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-17
              • 2010-10-12
              • 1970-01-01
              • 2014-06-05
              • 1970-01-01
              相关资源
              最近更新 更多