2016-09-16 43 views
2

我列出了其中列出用戶的簡單列表。對每個用戶的用戶限制的急切加載

$groups = Group::with(['users' => function ($query) { 
     $query->orderBy('last_login', 'ASC'); 
}])->get(); 

通過該代碼,我得到所有數據。

enter image description here

我的目標是在該列表來限制最大用戶10元每列表。問題是當我添加 - >限制(10)到代碼...我限制所有組中的所有用戶。所以如果我有10個小組,我會在每個小組中獲得1個用戶。

$groups = Group::with(['users' => function ($query) { 
     $query->orderBy('last_login', 'ASC')->limit(10); 
}])->get(); 

我的問題是,我怎麼能限制每個組10個用戶。

現在withound - >限制(10)我不能讓我在的foreach代碼結果...

@if ($loop->iteration == 10) 
     @break 
@endif 

但它在optymalization方面並不完美,因爲我總是讓所有用戶,並顯示僅10.

enter image description here

+1

您可能有興趣查看https://softonsofa.com/tweaking-eloquent-relations-how-to-get-n-related-models-per-parent/ –

回答

0

可以必須使用偏移或跳躍()方法:

$users = DB::table('users') 
       ->offset(10) 
       ->limit(5) 
       ->get(); 

$users = DB::table('users')->skip(10)->take(5)->get(); 

在這個例子中,偏移/ skip是要跳過,然後行數如何採取下一步的5個值。在這種情況下,它將跳過前10位,並將行10-15中的數據帶給您。您必須每次將偏移值傳遞給控制器​​。

如果你不想做任何這一點,你可以使用laravels分頁:

$users = User::where('votes', '>', 100)->paginate(15); 

15是你想每頁顯示的數據的數量。返回給你的觀點,你會顯示它是這樣的:

@foreach ($users as $user) 
    {{ $user->name }} 
@endforeach 

{{ $users->links() }} 

這適用於larave 5 *,只需搜索你正在使用的版本正確的文件。

Laravel Pagination Doc

Laravel 5.3 Skip Doc

0

事實上試圖做1個查詢數據庫獲取各組的前X記錄了一組由語句是做一個複雜的東西,通常是通過使用變量來實現,臨時表,特殊功能,工會或其他類型的技巧。

然後,試圖通過框架的數據模型綁定來實現這一點,它會更加複雜。

相反,我會建議你做N + 1個查詢(其中N將被限制在一個最大常數希望)其中N是你的組數。

所以,這裏是我的意思。

獲取組的列表,並且在這裏確保限制最大值,無論如何獲取大量的組是不合理的,這樣你就可以確保你的性能不會太差許多疑問。

$group_list = Group::orderBy('somethingYouLikeHere')->limit(20)->get(); 

然後你遍歷該組列表來獲取頂級X用戶:

$all_groups_data = []; 
foreach ($group_list as $group) { 
    $users = User::where('group_id', $group->id)->orderBy('last_login', 'ASC')->limit(10)->get(); 
    $all_groups_data[$group->id] = $users; 
} 
// You could also consider using a collection instead of an array 

而且你去那裏。
通常情況下,您更喜歡一次性將所有內容都集中起來的奇特查詢,但在這種情況下,這可能最終會導致一個非常複雜的代碼和查詢,難以理解和解密。
有了這個表現應該沒問題,而且你得到的結果是一個簡短易讀的代碼。

我希望它有幫助。

更新

如果有許多團體,你甚至可以分頁的頁面。
爲此,只需在第一個查詢中使用paginate()函數來獲取組。