你能查询一个数组吗? Laravel 5.2

时间:2016-05-03 16:28:27

标签: php mysql database laravel laravel-5.2

这可能是一个愚蠢的问题,但我正在开发一个应用程序,我们需要计算一些基本的人口统计数据。我想一次访问数据库,然后尝试查询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;

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

谢谢,

马特

5 个答案:

答案 0 :(得分:2)

你想要收藏。
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

您可以在这两种对象类型上使用各种逻辑,这些逻辑与用于Eloquent数据库查询的构建器基本相同。

答案 1 :(得分:0)

是的,你可以,Eloquent有一个聚合ToString方法,试试这个:

count

答案 2 :(得分:0)

查询数据库一次,然后filter生成的集合会更有效:

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

$percent = count($peopleOver60) / $total;

答案 3 :(得分:0)

是的,性能很好 你可以改变你的代码:$ people to Person ::

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

答案 4 :(得分:-2)

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