2015-10-06 114 views
0

我正在寻找使用雄辩的几个查询,这些查询都将被返回到单个视图,并想知道是否有更好的方法来做到这一点比查询数据库多次?查询Lavavel结果集

例如返回所有的记录,然后从那里拉数据的子集?

目前我有类似的东西:

$one = User::queryOne(); 
$two = User::queryTwo(); 
$three = User::queryThree(); 

不过,我想它会更好,如果有可能做这样的事情:

$users = User::all(); 

$one = $users->where('created_at')... 
$two = $users->where('modified_at').. 

显然上述不起作用,但它可能做到这样的事情?

或者最好每次都单独查询数据库吗?

回答

1

从实用的角度来看,做多个查询是'更好'的,因为它需要你花更少的时间来编写它们,而且它们更易于阅读和调试。如果你想用一个数据库查询来完成它,然后从中获取子集,那么你必须编写自己的逻辑逻辑,或者写一个新的Laravel集合类。然后有人出现并且奇怪,“这个代码发生了什么?”

通常,程序员时间是项目中最受限制的资源。完成之后,如果发现多个数据库查询是瓶颈,那么请考虑重新编写它。

如果你确实决定做一个查询,你可能可以按照你想要的标准字段排序数据。然后遍历结果集,每次指定字段值更改时将行添加到新数组中。这是我能想到的最简单的逻辑。

1

您使用的是什么版本的laravel?在5.1中,你可以在收藏here的地方做。在4.2你可以用回调here

编辑这样做
4.2与此类似

$users = User::all(); 
$one = $users->filter(function($user) 
{ 
    if($user->age > 20){ 
     return true; 
    } 
    return false; 

}); 
+0

我使用的是版本4.2 – user1105056

+0

检查我的编辑,看看是否可以帮助您找到解决方案 –

1

Laravel雄辩尝试一些返回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()的记录,那么最好对数据库使用三种不同的查询(特别是如果结果只有几条记录)。