2015-10-06 148 views
0

我正在尋找使用雄辯的幾個查詢,這些查詢都將被返回到單個視圖,並想知道是否有更好的方法來做到這一點比查詢數據庫多次?查詢Lavavel結果集

例如返回所有的記錄,然後從那裏拉數據的子集?

目前我有類似的東西:

$one = User::queryOne(); 
$two = User::queryTwo(); 
$three = User::queryThree(); 

不過,我想它會更好,如果有可能做這樣的事情:

$users = User::all(); 

$one = $users->where('created_at')... 
$two = $users->where('modified_at').. 

顯然上述不起作用,但它可能做到這樣的事情?

或者最好每次都單獨查詢數據庫嗎?

回答

1

從實用的角度來看,做多個查詢是'更好'的,因爲它需要你花更少的時間來編寫它們,而且它們更易於閱讀和調試。如果你想用一個數據庫查詢來完成它,然後從中獲取子集,那麼你必須編寫自己的邏輯邏輯,或者寫一個新的Laravel集合類。然後有人出現並且奇怪,「這個代碼發生了什麼?」

通常,程序員時間是項目中最受限制的資源。完成之後,如果發現多個數據庫查詢是瓶頸,那麼請考慮重新編寫它。

如果你確實決定做一個查詢,你可能可以按照你想要的標準字段排序數據。然後遍歷結果集,每次指定字段值更改時將行添加到新數組中。這是我能想到的最簡單的邏輯。

1

您使用的是什麼版本的laravel?在5.1中,你可以在收藏here的地方做。在4.2你可以用回調here

編輯這樣做
4.2與此類似

$users = User::all(); 
$one = $users->filter(function($user) 
{ 
    if($user->age > 20){ 
     return true; 
    } 
    return false; 

}); 
+0

我使用的是版本4.2 – user1105056

+0

檢查我的編輯,看看是否可以幫助您找到解決方案 –

1

Laravel雄辯嘗試一些返回Collection結果。 您可以使用foreach聲明或使用Collections functions中的內部版本,您可以操縱結果並創建子結果。

例如,你可以使用filter,做這樣的事情:

$users = User::all(); 
$one = $collection->filter(function ($item) { 
    return $item->created_at >= time() - (24*60*60); // created the last day 
}); 

$filtered->all(); 

無論是最好的方法取決於應用程序,您正試圖獲取/處理的數據量。

如果您只有::all()的幾條記錄,那麼這樣做可能是一個好方法(儘管使用集合函數您必須在數據上運行三個過濾器)。

如果你有很多來自::all()的記錄,那麼最好對數據庫使用三種不同的查詢(特別是如果結果只有幾條記錄)。