【问题标题】:Laravel Eloquent: Ordering results of all()Laravel Eloquent:all() 的排序结果
【发布时间】:2013-06-30 01:08:06
【问题描述】:

我被困在一个简单的任务上。 我只需要订购来自此调用的结果

$results = Project::all();

Project 是一个模型。这个我试过了

$results = Project::all()->orderBy("name");

但它没有用。从表中获取所有数据并对其进行排序的更好方法是什么?

【问题讨论】:

    标签: laravel laravel-4 eloquent sql-order-by


    【解决方案1】:

    查看 Eloquent 的 sortBy 方法:http://laravel.com/docs/eloquent

    【讨论】:

      【解决方案2】:

      您实际上可以在查询中执行此操作。

      $results = Project::orderBy('name')->get();
      

      这将以正确的顺序返回所有结果。

      【讨论】:

      【解决方案3】:

      此外,为了支持前面的答案,它也可以通过添加作为第二个参数的desc 降序或升序asc 进行排序。

      $results = Project::orderBy('created_at', 'desc')->get();
      

      【讨论】:

        【解决方案4】:

        如果您仍想使用 all(),您仍然可以使用 sortBy(在集合级别)而不是 orderBy(在查询级别),因为它返回一个对象集合。

        升序

        $results = Project::all()->sortBy("name");
        

        降序

        $results = Project::all()->sortByDesc("name");
        

        查看有关集合的文档了解更多详细信息。

        https://laravel.com/docs/5.1/collections

        【讨论】:

        • 正是我想要的。与在查询级别使用 orderBy 相比,广泛使用它会有什么缺点吗?
        • \@foreach ($posts->sortByDesc('created_at') as $post) \@include('posts.post') \@endforeach
        • 我很想知道这是如何在幕后工作的。让我印象深刻的是,使用 sortBy() 对集合进行排序是发生在 Laravel 引擎中(在 PHP 中),而 orderBy() 是在数据库中完成的。当然,在几乎所有可以想象的情况下,数据库都会变得更快,并且随着数据集的增加,性能差异也会随之增加。我很想听听其他人对此的看法。
        • @cartbeforehorse 你需要知道哪个方法返回什么。 ::all() 可能只是在后台调用 ->get() ,而后者又返回一个集合。 sortBy() 是一个集合的方法,所以是的,它发生在 PHP 端(与在查询对象上调用的 orderBy() 相反)。完全使用 ::all() 是一个坏主意,更不用说在 PHP 中对其进行排序了。想象一下,如果 ::all() 返回一个包含一百万个对象的集合。获取它需要很长时间,并且在 PHP 中对其进行排序需要更多时间。当然,您可以使用 ::all() 如果您确定它只会返回少数对象(在一个集合中)。
        • 为什么这个不是公认的答案?它与 all() 函数一起使用。
        【解决方案5】:

        2017 年更新


        Laravel 5.4 为查询构建器添加了 orderByDesc() 方法:

        $results = Project::orderByDesc('name')->get();
        

        【讨论】:

          【解决方案6】:

          虽然您需要日期的结果为 desc

          $results = Project::latest('created_at')->get();
          

          【讨论】:

            【解决方案7】:

            注意,你可以这样做:

            $results = Project::select('name')->orderBy('name')->get();
            

            这会生成如下查询:

            "SELECT name FROM proyect ORDER BY 'name' ASC"
            

            在一些应用中,当DB没有优化,查询比较复杂,需要防止在finish SQL中生成ORDER BY,可以这样做:

            $result = Project::select('name')->get();
            $result = $result->sortBy('name');
            $result = $result->values()->all();
            

            现在是 php 对结果进行排序。

            【讨论】:

              【解决方案8】:

              这样做:

              $results = Project::orderBy('name')->get();
              

              为什么? 因为它快速!排序在数据库中完成。

              不要这样做:

              $results = Project::all()->sortBy('name');
              

              为什么? 因为它。首先,从数据库中加载行,然后加载到 Laravel 的 Collection 类中,最后在内存中排序。

              【讨论】:

              • 最好添加解释原因:第一种方法在数据库(查询)级别进行排序,这几乎总是更有效 - 最佳性能。我想说总是使用模型方法,当你需要第二种方法时,你会知道:)
              • 我认为第二种方式的性能更好。因为首先,记录由更有效的默认排序列获取。然后在代码中进行排序。
              • @AliN11 没有。第一个执行得更快。它是在数据库级别完成的。
              【解决方案9】:

              您的指令需要调用才能获取,因为它是通过目录带来的记录和订单

              $results = Project::orderBy('name')
                         ->get();
              

              例子:

              $results = Result::where ('id', '>=', '20')
              ->orderBy('id', 'desc')
              ->get();
              

              在示例中,数据按“where”过滤,并带来大于 20 的记录和 orderBy 目录按顺序从高到低。

              【讨论】:

                【解决方案10】:

                试试这个:

                $categories     =   Category::all()->sortByDesc("created_at");
                

                【讨论】:

                  【解决方案11】:

                  一个有趣的事情是多重排序:

                  根据laravel docs

                  DB::table('users')
                     ->orderBy('priority', 'desc')
                     ->orderBy('email', 'asc')
                     ->get();
                  

                  这意味着 laravel 将根据 priority 属性对结果进行排序。完成后,它将在内部根据email 以相同的priority 排序结果。

                  编辑:

                  正如@HedayatullahSarwary 所说,建议您更喜欢 Eloquent 而不是 QueryBuilder。当然,我不鼓励使用 QueryBuilder,我们都知道每个都有自己的用例。

                  为什么我用 QueryBuilder 写了一个答案?正如我们在eloquent documents 中看到的:

                  您可以将每个 Eloquent 模型视为一个强大的查询构建器,让您可以流畅地查询与模型关联的数据库表。

                  BTWS 上面带有 eloquent 的代码应该是这样的:

                  Project::orderBy('priority', 'desc')
                  ->orderBy('email', 'asc')
                  ->get();
                  

                  【讨论】:

                  • 你已经在 Laravel Query Builder 中创建了你的查询,你应该使用 Laravel Eloquent。
                  • @HedayatullahSarwary 没有任何区别。我编辑了回复。看看吧!
                  【解决方案12】:

                  在 Laravel Eloquent 中,您必须像下面的查询一样创建它会从数据库中获取所有数据,您的查询不正确:

                  $results = Project::all()->orderBy("name");
                  

                  你必须这样使用它:

                  $results = Project::orderBy('name')->get();
                  

                  默认情况下,您的数据按升序顺序排列,但您可以按以下方式使用它:

                  $results = Project::orderBy('name', 'asc')->get();
                  

                  或按降序顺序:

                  $results = Project::orderBy('name', 'desc')->get();
                  

                  【讨论】:

                    猜你喜欢
                    • 2014-08-04
                    • 2019-04-29
                    • 2020-05-06
                    • 2020-08-14
                    • 2019-10-30
                    • 1970-01-01
                    • 2014-10-31
                    • 1970-01-01
                    • 2020-04-21
                    相关资源
                    最近更新 更多