2015-12-03 56 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个家庭分支,所以我可能需要一些数组或其他东西......并感谢关于授权的链接 - 它看起来更像面向操作而不是过滤数据,但我相信它会有帮助!与此同时,另一个答案让我起来跑步,所以我很好走。谢谢! –