繁体   English   中英

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)是否有一种快速简便的方法,可以根据premium属性将结果集合分为两个集合? (我知道Laravel有许多快捷方式,但是我仍然是框架的新手)

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

我可以认为将其保留为单独的查询的唯一原因是,如果您需要对数据进行分页-如果将它们全部混合在一起,就不能轻松地进行操作。

“捷径”将使用集合filter()方法,我在捷径中加上了捷径,因为它本身不是短的,更像糖的糖-但是Larvel如果没有装满糖就什么都不是,那为什么不呢?

代码如下所示:

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

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

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

编辑:我建议使用马特·伯罗(Matt Burrow)的答案,但由于解决方案有所不同,我将在这里保留我的意见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM