这可能是一个愚蠢的问题,但我正在开发一个应用程序,我们需要计算一些基本的人口统计数据。我想一次访问数据库,然后尝试查询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;
我的想法是后者会更有效率(如果可能的话),因为它只进行一次数据库访问并在服务器端进行聚合操作?或者,最好是进行多次查询并让数据库完成所有聚合操作?
谢谢,
马特
答案 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/