【问题标题】:Can you query an array? Laravel 5.2你能查询一个数组吗?拉拉维尔 5.2
【发布时间】:2016-05-03 16:28:26
【问题描述】:

这可能是一个愚蠢的问题,但我正在开发一个应用程序,我们需要计算一些基本的人口统计数据。我想访问数据库一次,然后尝试查询该 Eloquent 模型数组。现在我正在使用查询获取一个数组,然后循环遍历它以计算一些统计信息。

$people = Person::all();
$total = count($people);
$count = 0;
foreach($people as $person)
    if($person->age > 60) {
        count++;
    }
}
$percent = $count/$total;

这可行,但我们必须为数百个数据点执行此操作。

我可以这样做吗?

$people = Person::all();
$total = count($people);
$count = $people->where('age', '>=', '60')->count();
$percent = $count/$total;

我的想法是后者会更有效(如果可能的话),因为它只访问数据库并在服务器端进行聚合操作?还是进行多个查询并让数据库完成所有聚合操作会更好?

谢谢,

马特

【问题讨论】:

    标签: php mysql database laravel laravel-5.2


    【解决方案1】:

    你想要收藏。
    https://laravel.com/docs/5.2/collections

    Laravel 中的集合是方便的数组包装器,它提供了与 ODB 结构非常相似的额外逻辑。事实上,当你得到 Eloquent 结果时,你会得到一个特殊的数据库集合。

    https://laravel.com/api/5.1/Illuminate/Support/Collection.html
    https://laravel.com/api/5.1/Illuminate/Database/Eloquent/Collection.html

    您可以在这两种对象类型上使用各种逻辑,这些逻辑与 Builders for Eloquent DB 查询基本相同。

    【讨论】:

    • 这似乎是我提出的一般问题的最佳解决方案,在 Laravel 中过滤数组。我标记了 jose' up 因为它更适合我的情况。如果再次出现这种情况,我将对此进行调查。
    【解决方案2】:

    可以,Eloquent 有一个聚合的 count 方法,试试这个:

    $total = Person::count();
    $count = Person::where('age', '>=', '60')->count();
    $percent = $count/$total;
    

    【讨论】:

    • 我喜欢这种方法,但还是经常去 DB 对吧?我一直在办公室询问,似乎最终的解决方案是创建一个存储过程来进行所有聚合并从 laravel 调用它,所以只用你需要的数据进行一次旅行。
    • 我认为你是对的@MattCatellier,对 DB 的许多查询会使进程变慢
    • 谢谢何塞!认为存储过程将需要更多的工作,但很高兴知道一些事情。当我找到它时,我会尝试发布我的解决方案
    【解决方案3】:

    查询一次数据库会更有效率,然后filter结果集合:

    $people = Person::all();
    $total = count($people);
    $peopleOver60 = $people->filter(function($item) {
        return $item->age >= 60;
    });
    
    $percent = count($peopleOver60) / $total;
    

    【讨论】:

      【解决方案4】:

      是的,非常适合性能 并且您可以将代码更改为 :$people 为 Person::

      $people = Person::all();
      $total = count($people);
      $count = Person::where('age', '>=', '60')->count();
      $percent = $count/$total;
      

      【讨论】:

        【解决方案5】:

        您的数据库针对搜索查询进行了优化,但 PHP 没有。您应该在 DB 中使用“where”查询。但如果你想要它,你可以检查这个库: https://phplinq.codeplex.com/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-24
          • 2018-01-01
          • 2017-03-12
          • 2016-02-06
          • 2015-04-13
          • 2014-11-12
          • 2016-07-30
          • 1970-01-01
          相关资源
          最近更新 更多