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



我正在使用laravel框架,我需要获得两个数组,一个具有高级主题,另一个具有免费主题。。所以我会这么做:

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

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

$themes = AppTheme::all();

然后我要在php中处理它,以基于主题溢价属性进行拆分。

所以我有两个问题:

1) 在这种情况下,一个查询比两个查询好,还是我想得太多了?

2) 有没有一种快速简单的方法可以根据溢价房产将所得藏品拆分为两个藏品?(我知道Laravel有很多捷径,但我对这个框架还是个新手)

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

你可以简单地这样过滤它们;

简单的单线解CCD_ 1。

或者,如果你需要通过另一个元素等进行过滤,只需在下面添加更多即可;

$themes = AppTheme::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类。

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

一个"捷径"是使用集合filter()方法,我把捷径放在引号里,因为它本身并不短,更符合语法——但Larvel如果不富含糖,那就什么都不是了,为什么不呢?

代码看起来像这样:

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

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

最新更新