查询Lavavel结果集

时间:2015-10-06 20:31:15

标签: php laravel eloquent

我希望使用eloquent进行多次查询,这些查询都将返回到单个视图,并且想知道是否有更好的方法来执行此操作而不是多次查询数据库?

例如,返回所有记录,然后从中拉出子数据集?

目前我有类似的东西:

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

但是我觉得如果有可能做的话会更好:

$users = User::all();

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

显然上面的方法不起作用但可以这样做吗?

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

3 个答案:

答案 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()的大量记录,那么最好对数据库使用三个不同的查询(特别是如果结果只有几条记录)。