2016-01-31 45 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); 
} 

我希望我没有错过任何东西。 我失去了太多的时间在这个... 希望它会帮助别人。

如果您需要更多的代码,请询问它,但它仍然新鲜。