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

Laravel - Single query then splitting Vs Two queries

我正在使用 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 有很多快捷方式,但我对这个框架还是个新手)

我认为将其保留为单独查询的唯一原因是,如果您需要对数据进行分页 - 如果所有数据混合在一起,您就无法轻松完成。

A​​ "short cut" 将使用集合 filter() 方法,我将 short cut 放在引号中,因为它本身并不短,更多的是语法糖 - 但 Larvel 如果没有充满就什么都不是糖为什么不呢?

代码看起来像这样:

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

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

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

编辑:我建议使用 Matt Burrow 的回答,但由于解决方案不同,我将保留在这里。

单个查询会更好,因为两个查询都将遍历数据库中的所有行。除了拆分它们的 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 class。