Laravel 5.2,三种方式太多

时间:2016-01-31 19:36:35

标签: laravel-5 many-to-many pivot-table

我想做以下事情。

我有三种模式: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();
    });

我将User添加到Business

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

这应该将数据透视表中的行添加为:[' 1',' 2',' 3']。

我的问题是:

  • 这是正确的方法吗?
  • 如何进行分离方法?
    $user->businesses()->detach($business_id)->where('role_id',$role_id); 这不是正确的语法,但是像这样。如果用户在业务中有两个角色(例如:'导演'和销售经理')在分离时我想删除其中一个角色(例如:&#39导演')而不是所有人。我相信运行$user->businesses()->detach($business_id);会分离所有角色。
  • 有没有办法使用sync()方法?

1 个答案:

答案 0 :(得分: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);
}

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

如果您需要更多代码,请在问题新鲜时询问。