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