我希望使用eloquent进行多次查询,这些查询都将返回到单个视图,并且想知道是否有更好的方法来执行此操作而不是多次查询数据库?
例如,返回所有记录,然后从中拉出子数据集?
目前我有类似的东西:
$one = User::queryOne();
$two = User::queryTwo();
$three = User::queryThree();
等
但是我觉得如果有可能做的话会更好:
$users = User::all();
$one = $users->where('created_at')...
$two = $users->where('modified_at')..
显然上面的方法不起作用但可以这样做吗?
或者最好每次都单独查询数据库?
答案 0 :(得分:1)
从实用的角度来看,进行多个查询会“更好”,因为它会花费更少的时间来编写它们,并且它们更易于阅读和调试。如果你想用一个数据库查询来做,然后从中获取子集,你必须编写自己的复杂逻辑,或者可能是一个新的Laravel集合类。然后其他人出现并想知道,“这段代码中发生了什么?”
通常,程序员时间是项目中受约束最多的资源。完成后,如果发现多个数据库查询是瓶颈,那么考虑重新编写它。
如果您决定执行一个查询,则可以按照条件所需的字段对数据进行排序。然后遍历结果集,每次指定字段的值更改时将行添加到新数组。这是我能想到的最简单的逻辑。
答案 1 :(得分:1)
您使用的是什么版本的laravel?在5.1中,您可以在集合here上执行操作。在4.2中,您可以使用回调here
执行此操作 EDIT
4.2尝试与此类似的东西
$users = User::all();
$one = $users->filter(function($user)
{
if($user->age > 20){
return true;
}
return false;
});
答案 2 :(得分:1)
Laravel Eloquent返回Collection
作为结果。
您可以使用foreach
语句或使用Collections functions中的构建,您可以操作结果并创建子结果。
例如,您可以使用filter
并执行以下操作:
$users = User::all();
$one = $collection->filter(function ($item) {
return $item->created_at >= time() - (24*60*60); // created the last day
});
$filtered->all();
它是否是最佳方法取决于您尝试获取/处理的应用程序和数据量。
如果您只有::all()
的一些记录,那么这样做可能是一个很好的方法(尽管使用集合函数,您必须在数据中运行三个过滤器)。
如果你有来自::all()
的大量记录,那么最好对数据库使用三个不同的查询(特别是如果结果只有几条记录)。