[英]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.