2016-01-31 44 views
0

我想做以下操作。Laravel 5.2,三路太多太多

我有三個型號:UserBusinessRole

它們連接如下:用戶可以有多種角色,並且屬於多個企業。

角色已預定義。

我希望每個用戶可以在不同的業務中有不同的角色。 例如,在business1中,用戶具有角色sales manager,但在business2中他具有角色director。用戶可以在同一業務上擁有多個角色。

User型號:

public function businesses() 
{ 
    return $this->belongsToMany('App\Business')->withTimestamps(); 
} 

Business型號:

public function users() 
    { 
     return $this->belongsToMany('App\Business')->withTimestamps(); 
    } 

透視表:

Schema::create('business_user', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->timestamps(); 
     $table->integer('business_id')->unsigned(); 
     $table->integer('user_id')->unsigned(); 
     $table->integer('role_id')->unsigned(); 
    }); 

我添加UserBusiness爲:

$user->businesses()->attach($business_id, ['role_id' => $roleId]); 

這應該將數據透視表中的行添加爲:['1','2','3']。

我的問題是:

  • 這是這樣做的正確方法?
  • 我該如何處理detach方法?
    $user->businesses()->detach($business_id)->where('role_id',$role_id); 這不是正確的語法,但是像這樣。如果用戶在業務中有兩個角色(例如:'director'和'sales manager'),我想刪除其中一個角色(例如:'director'),而不是全部角色。我相信運行$user->businesses()->detach($business_id);將分離所有角色。
  • 有沒有辦法使用這個sync()方法?
+1

使用範圍來篩選該用戶和該業務的正確角色。我認爲你們的關係很好 –

+0

嘿@MikeMiller,最後我明白了這一點,這表明我正確的方向,謝謝。 – dbr

回答

0

我結束了下面這樣的事情。這不是測試,因爲我的代碼是一個比較複雜的,所以請通知我,如果你看到任何錯誤:

用戶模型:

public function roles() 
{ 
    return $this->belongsToMany('App\Role')->withTimestamps(); 
} 
public function businesses() 
{ 
    return $this->belongsToMany('App\Business')->withTimestamps(); 
} 
public function businessesAdmin() 
{ 
    return $this->belongsToMany('App\Business')->withTimestamps()->wherePivot('role_id', $role_id = 'whatever_is_your_businessAdmin_role_id'); 
} 

用戶控制器:

function addAdminRole(Request $r) { 
    //get the user_id and business_id from the $r 
    //define $businessAdminRole_id 
    $user->businesses()->sync([$business_id => ['role_id' => $businessAdminRole_id]]); 
} 

function removeAdminRole(Request $r) { 
    $user = User::findOrFail($request->user_id) 
    business = $request->business; 
    $user->businessesAdmin()->detach($business_id); 
} 

我希望我沒有錯過任何東西。 我失去了太多的時間在這個... 希望它會幫助別人。

如果您需要更多的代碼,請詢問它,但它仍然新鮮。