Laravel在Eloquent Collection中嵌套ForEach

时间:2017-03-29 01:29:16

标签: php arrays laravel-5

我正在尝试使用多对多关系来完成以下工作流程:

  1. 有很多部分和很多用户。每个用户都有他们已解锁的部分。因此,例如,如果有两个部分(第一部分和第二部分)第一个用户Jim(id = 1)已解锁部分X,则第二个用户Debbie(id = 2)已解锁部分我和我。

  2. 为实现这一目标,我有三个数据库,一个标准的Laravel users,然后一个sections存储部分数据id = 1用于第一部分和id = 2对于第II节),然后是user_section我已成功用作UserSection模型之间的联合表。该连接表是用户和部分混合的地方,如果该部分中有给定user_id的条目,则相应的section_id将被解锁。

  3. 我有以下功能,它应该是1.获取视图的所有部分和2.让我知道哪些部分是由用户解锁的。

    问题是我得到重复的部分显示,所以它会说第一部分被解锁,然后部分I被锁定在同一个视图中,这必须是我如何遍历和比较数组。通过对代码的调整(我放置break的地方,我可以摆脱重复,但是错误的部分被锁定。

    我的逻辑在这里:

    public function getSections(){
        $arrayofuserSections = array();
        $tempArray = array();
        $user = User::where("id",Auth::user()->id)->first();
        foreach ($user->section as $section) {
        $tempArray['Name'] = $section["name"];
        $tempArray['Goals'] = $section["goals"];
        array_push($arrayofuserSections,$tempArray);
    }
        $finarray = array();
        $sections=Section::orderBy('order')->get();
        foreach ($sections as $section) {
        foreach($arrayofuserSections as $arraysection){
        if($section->name == $arraysection["Name"])
        {
        $arraysection["Unlocked"] = 1;  
        array_push($finarray,$arraysection);
        }
        else{
        $arraysection["Unlocked"] = 0;
        $arraysection["Name"] = $section->name;
        $arraysection["Goals"] = "";
        array_push($finarray,$arraysection);
        }
        break;
        }
        }
        return $finarray;
    }
    

    $user->section源自User模型上的方法,此处为:

    public function section()
        {
            return $this->belongsToMany('App\Models\Section','user_section')->withTimestamps();
        }
    

    我为Debbie用户播种的是:

            DB::table('user_section')->insert([
                'user_id' => 2,
                'section_id'=>1
            ]);
            DB::table('user_section')->insert([
                'user_id' => 2,
                'section_id'=>2
            ]);
    

    但是当我以Debbie身份登录时,我得到以下结果:

    所以尽管黛比在连接表中都有两个部分,但只有其中一个部分解锁,如果我移除或移动中断,这又会改变。

    Console Log

1 个答案:

答案 0 :(得分:1)

我认为你是从错误的方向来到这里的。

如果您已正确设置关系,则应该能够访问用户和部分用户的部分。

// Find user with sections they have unlocked
$user = User::with('sections')->findOrFail(1);

// Find sections with users who have unlocked them
$section = Section::with('users')->findOrFail(1);

如果从部分方向处理此问题,您可以执行以下操作:

// Find current user id
$userId = Auth::id();

// Find all sections with users who have unlocked them, limited to only the current user
$sections = Section::with([
        'users' => function ($query) use ($userId) {
            return $query->where('id', $userId);
        }
    ])->get();

这将为您提供所有部分,并急切加载用户关系,即当前用户。因此,如果用户关系为空,则当前用户尚未解锁该部分。