2014-11-05 246 views
0

添加約束考慮這個簡單多到很多laravel關係:laravel:許多一對多的關係

class User extends Eloquent { 

    public function roles() 
    { 
    return $this->belongsToMany('Role'); 
    } 

} 

和 類角色擴展雄辯{

public function users() 
    { 
    return $this->belongsToMany('User'); 
    } 

} 

這是確定保留user_idrole_id的模式role_user。 但我們如果有其他約束?例如在像github這樣的應用程序中,用戶是管理員在存儲庫A中,並且是存儲庫B中的常規用戶。所以我們將repository_id添加到role_user表中,但是當我想查詢user->roles我想在當前存儲庫中查找那個,在會話中保留參考current_repository_id型號要做什麼改變?


注意:我不想改變任何使用代碼!是不是把過濾器邏輯放在模型聲明中?因爲我處於大型項目的中間,所以改變每一種用法都很困難。可能嗎?

回答

4
//User model 
public function roles() 
{ 
    $repoID = MyApp::currentRepoID(); 

    return $this->belongsToMany('Role', 'pivot_table_name', 'user_id', 'role_id') 
     ->wherePivot('repository_id', $repoID); 
} 
1

如果您需要將其他字段添加到數據透視表,則應該使用 - > withPivot()方法。 如果您的數據透視表結構是這樣的:

ID | role_id | user_id | repository_id

你應該使用

return $this->belongsToMany('Role', 'pivot_table_name', 'user_id', 'role_id')->withPivot('repository_id'); 

然後,無論你使用它,你要做的:

$role = Role::find(1); 
$role->pivot->repository_id; 

$user = User::find(1); 
foreach ($user->roles as $role) { 
    echo $role->pivot->repository_id; 
} 
+0

我不不想改變任何使用代碼!是不是把過濾器邏輯放在模型聲明中?因爲我處於大型項目的中間,所以改變每一種用法都很困難。 – shidsun 2014-11-05 10:55:54

1

退房Eloquent Triple Pivot(也Packagist),它聽起來像它完全一樣NT。

你會設置你的模型爲UserRepositoryRole(一User有許多Repository S和可以在每個Role)。然後看GitHub的頁面(特別是第6步)上的文檔,並且您可以定義此對您Repository型號:

class Repository extends Eloquent { 
    ... 
    public function getRolesAttribute() { 
     return $this->getThirdAttribute(); 
    } 
} 

然後,你可以簡單地調用

$user = User::find(1); 

$repo = $user->repositories->first(); 
// or 
$repo = $user->repositories->find(73); 

$roles = $repo->roles; 

// Or the above can be condensed into just... 
$roles = User::findOrFail(1) 
      ->repositories() 
      ->findOrFail(73) 
      ->roles;