2017-03-29 53 views
0

我試圖用一個多對多的關係來完成以下工作流程:Laravel嵌套的ForEach在雄辯的收藏

  1. 有許多章節和許多用戶。每個用戶都有他們已解鎖的部分。例如,如果有兩個部分(第I部分和第II部分),第一個用戶Jim(id = 1)已解鎖X部分,第二個用戶Debbie(id = 2)已解鎖第I部分和第II部分。

  2. 爲了實現這一點,我有三個數據庫,一個標準Laravel users,則sections存儲該部分的數據(id = 1爲第I和id = 2爲第二節),然後user_section,我已成功地被用作聯合表格UserSection之間的表格。該連接表是用戶和部分混合的地方,如果在該部分中給定user_id的條目,則相應的section_id被解鎖。

我有以下功能應該是1.獲取視圖的所有部分和2.讓我知道哪些部分是由用戶解鎖。

問題是我得到重複部分顯示出來,所以它會說第一部分被解鎖,然後第一部分被鎖定在同一視圖中,這必須是我如何遍歷和比較數組。隨着調整的代碼(這裏我把一個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(); 
    } 

我的用戶黛比播種是在這裏:

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

然而,我得到以下結果登錄時的黛比:

所以儘管黛比在連接表兩部分,她只得到了其中的解鎖之一,這同樣改變,如果我刪除或移動休息一下。

Console Log

回答

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

這會給你所有版面裏,急切負載的用戶關係,其中,它是當前用戶。因此,如果用戶關係爲空,則當前用戶尚未解鎖該部分。

+0

謝謝,正確的方向邁出的一大步! –