Laravel 将动态数量的集合合并在一起

Laravel 将动态数量的集合合并在一起,laravel,collections,merge,eloquent,Laravel,Collections,Merge,Eloquent,我正在做我的第一个拉威尔项目:家谱。我有4个家族分支,每个分支都有人/家族/图片/故事/等等。网站上的某个给定用户将可以访问家族中1、2或4个分支的所有内容(我不想为与他们无关的人显示表亲的内容) 因此,在不同的页面上,我希望控制器的集合包含基于给定用户权限的内容。合并似乎是正确的方法 我有一个范围可以从家庭的每个分支中找到人,在下面的例子中,我也有一个范围可以找到这个月有生日的人。为了给这个用户显示一组正确的生日,我可以通过单独合并每个组(如果他们有访问权限的话)来实现 如果我向所有4个家族分

我正在做我的第一个拉威尔项目:家谱。我有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上调用merge(或者空数组,或者我尝试过的其他版本的'nothing')

这样做的好方法是什么?

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());
}

您希望您的雄辩的查询只返回请求它的用户的相关数据。当琼斯的人访问该页面时,查询李的生日是没有意义的

所以你最终会做的是

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

这会将其
家庭属性等于当前用户家庭的人员拉入

这可能与你现在处理人际关系的方式不符,但希望它能让你走上正确的轨道,解决问题


如果您真的想继续进行一系列查询和检查授权,请阅读Laravel的功能。它将允许您为用户分配能力并轻松检查。

谢谢Brynn!用户可以访问多达4个家庭分支,所以我可能需要一些阵列或其他东西。。。感谢您提供关于授权的链接-看起来这更适合于操作,而不是过滤数据,但我相信这会有所帮助!与此同时,另一个答案让我振作起来,所以我很乐意去。谢谢是的,就是这个!!!两种方法都有效,第二种方法更短/更干净。非常感谢你的帮助!合并辅助对象覆盖具有相同ID的元素: