2015-12-03 63 views
0

我正在開發我的第一個laravel項目:一棵家族樹。我有4個家庭分支,每個分支都有人/家庭/圖片/故事/等等。網站上的特定用戶將可以訪問這些家庭分支中1,2或4個的所有內容(我不想向他們不相關的人展示表弟內容)。將動態數量的集合合併在一起

因此,在各種頁面上,我希望來自控制器的集合包含基於給定用戶權限的內容。合併似乎喜歡正確的方式來做到這一點。

我有範圍從家庭的每個分支中獲取人員,在下面的示例中,我還爲本月生日的人員提供了一個範圍。爲了顯示這個用戶的正確的生日,我可以通過合併每個組,如果他們有權訪問。

這裏是我的功能是什麼樣子,如果我發現在所有4家分支機構大家:

public function get_birthday_people() 
{ 
    $user = \Auth::user(); 

    $jones_birthdays = Person::birthdays()->jones()->get(); 
    $smith_birthdays = Person::birthdays()->smith()->get(); 
    $lee_birthdays = Person::birthdays()->lee()->get(); 
    $brandt_birthdays = Person::birthdays()->brandt()->get(); 

    $birthday_people = $jones_birthdays 
     ->merge($smith_birthdays) 
     ->merge($lee_birthdays) 
     ->merge($brandt_birthdays); 

    return $birthday_people; 

我的挑戰:我想修改它,讓我檢查用戶的訪問,只有添加的每個組的人相應。我想象一些地方這一切都與上面相同,除了我添加條件語句是這樣的:

 if($user->jones_access) { 
$jones_birthdays = Person::birthdays()->jones()->get(); 
} 
    else{ 
$jones_birthdays =NULL; 
} 

但是,這會因用戶的錯誤,而不訪問,因爲我不能調用NULL合併(或一個空數組,或者我試過的其他版本的'沒有')。

什麼是這樣做的好方法?

回答

2
if($user->jones_access) { 
    $jones_birthdays = Person::birthdays()->jones()->get(); 
} 
else{ 
    $jones_birthdays = new Collection; 
} 

更重要的是,執行合併的情況下,沒有別的要求。

$birthday_people = new Collection; 
if($user->jones_access) { 
    $birthday_people->merge(Person::birthdays()->jones()->get()); 
} 
+0

是的,這是它!這兩種方式都有效,而第二種方式更短/更清潔。非常感謝你的幫助! –

0

您將希望您的Eloquent查詢僅向請求它的用戶返回相關數據。當瓊斯人訪問該頁面時,查詢李的生日是沒有意義的。

那麼你會什麼風了做是一樣的東西

$birthdays = App\Person::where('family', $user->family)->get();

這拉在其family屬性等於家庭當前用戶的人數。

這可能與你現在有你的關係的方式不匹配,但希望它會讓你走上正確的軌道,讓他們整理出來。

如果您確實想要進行一系列查詢並檢查授權,請閱讀Laravel的authorization功能。它會讓你爲用戶分配能力並輕鬆檢查它們。

+0

感謝Brynn!用戶可以訪問多達4個家庭分支,所以我可能需要一些數組或其他東西......並感謝關於授權的鏈接 - 它看起來更像面向操作而不是過濾數據,但我相信它會有幫助!與此同時,另一個答案讓我起來跑步,所以我很好走。謝謝! –