Laravel - 单个查询然后拆分Vs两个查询

时间:2015-02-25 16:35:28

标签: php laravel optimization

我正在使用laravel框架,我需要获得2个数组,一个使用高级主题,另一个使用免费主题..所以我会这样做:

$premium_themes = \App\Theme::where('premium', '=', '1')->get();
$free_themes = \App\Theme::where('premium', '=', '0')->get();

这将工作正常,但会对数据库执行两次查询。由于我是一名优化极客,我认为拥有一个查询可能会更好......我会通过使用获得所有主题:

$themes = \App\Theme::all();

然后我将在php中处理这个以基于主题高级属性进行拆分。

所以我有两个问题:

1)在这种情况下,单个查询优于2个查询,还是我过度思考?

2)是否有一种快速简单的方法可以根据高级属性将生成的集合拆分为两个集合? (我知道Laravel有许多快捷方式,但我仍然是框架的新手)

2 个答案:

答案 0 :(得分:5)

单个查询会更好,因为两个查询都将遍历数据库中的所有行。除了分裂它们的2个查询之外,它们将再次进行查询。

你可以简单地过滤它们;

简单的一行解$themes = \App\Theme::all()->groupBy('premium');

如果您需要按其他元素进行过滤等,请转到单独的集合中,只需在以下内容中添加更多内容即可;

$themes = \App\Theme::all();

$premium = new Collection;
$free = new Collection;

$themes->each(function ($item) use ($premium, $free){
    if($item->premium == '1'){
        $premium->push($item);
    } 
    else {
        $free->push($item);
    }
});

您的商品将被过滤到相关的Collection。请务必使用顶部的Collection课程。

答案 1 :(得分:0)

我认为将它作为单独的查询保留的唯一原因是,如果您需要对数据进行分页 - 如果它们全部混合在一起,则不能轻易做到。

“捷径”将是使用集合filter()方法,我在引号中加上捷径,因为它本身并不短,更多的合成糖 - 但如果没有糖,Larvel什么都没有,所以为什么不?

代码看起来像这样:

$allThemes = \App\Theme::all();

$premiumThemes = $allThemes->filter(function($theme)
{
    return $theme->premium;
});

$freeThemes = $allThemes->filter(function($theme)
{
    return !$theme->premium;
});

编辑:我建议使用Matt Burrow的答案,但我会留在我的,因为解决方案不同。

相关问题