Php 如何连接具有不同关系的多个表并在Laravel 5.3中使用attach()

Php 如何连接具有不同关系的多个表并在Laravel 5.3中使用attach(),php,mysql,laravel,relation,multiple-tables,Php,Mysql,Laravel,Relation,Multiple Tables,我试图在使用Laravel5.3注册我的项目时管理(初始)用户的角色。我已经让它第一次工作,但我不得不添加另一个表,现在我迷路了 我有4个表,公司,用户,角色和一个透视表,用于名为角色用户的用户和角色 公司表具有公司id 用户表具有公司id,用户id 角色表具有角色id,角色描述 角色用户表有公司id,用户id,角色id 用户模型 class User extends Model implements Authenticatable{ public function company

我试图在使用Laravel5.3注册我的项目时管理(初始)用户的角色。我已经让它第一次工作,但我不得不添加另一个表,现在我迷路了

我有4个表,公司用户角色和一个透视表,用于名为角色用户的用户和角色


公司表具有公司id

用户表具有公司id用户id

角色表具有角色id角色描述

角色用户表公司id用户id角色id



用户模型

class User extends Model implements Authenticatable{
    public function company(){
        return $this->belongsTo('App\Company', 'comp_id');
     }

    public function roles(){
       return $this->belongsToMany('App\Role', 'role_users', 'user_id', 'role_id')->withTimeStamps();
    }
}
class Role extends Model{
    public function users(){
        return $this->belongsToMany('App\User', 'role_users')->withTimeStamps();
    }

    public function comp(){
        return $this->belongsToMany('App\Company', 'role_users')->withTimeStamps();
    }

}
class Company extends Model{
    protected $primaryKey = 'comp_id';  

    public function members(){
        return $this->hasMany('App\User', 'comp_id');
    }

    public function roles(){
        return $this->hasMany('App\Role', 'role_users')->withTimeStamps();
    }
}


榜样

class User extends Model implements Authenticatable{
    public function company(){
        return $this->belongsTo('App\Company', 'comp_id');
     }

    public function roles(){
       return $this->belongsToMany('App\Role', 'role_users', 'user_id', 'role_id')->withTimeStamps();
    }
}
class Role extends Model{
    public function users(){
        return $this->belongsToMany('App\User', 'role_users')->withTimeStamps();
    }

    public function comp(){
        return $this->belongsToMany('App\Company', 'role_users')->withTimeStamps();
    }

}
class Company extends Model{
    protected $primaryKey = 'comp_id';  

    public function members(){
        return $this->hasMany('App\User', 'comp_id');
    }

    public function roles(){
        return $this->hasMany('App\Role', 'role_users')->withTimeStamps();
    }
}


公司模式

class User extends Model implements Authenticatable{
    public function company(){
        return $this->belongsTo('App\Company', 'comp_id');
     }

    public function roles(){
       return $this->belongsToMany('App\Role', 'role_users', 'user_id', 'role_id')->withTimeStamps();
    }
}
class Role extends Model{
    public function users(){
        return $this->belongsToMany('App\User', 'role_users')->withTimeStamps();
    }

    public function comp(){
        return $this->belongsToMany('App\Company', 'role_users')->withTimeStamps();
    }

}
class Company extends Model{
    protected $primaryKey = 'comp_id';  

    public function members(){
        return $this->hasMany('App\User', 'comp_id');
    }

    public function roles(){
        return $this->hasMany('App\Role', 'role_users')->withTimeStamps();
    }
}


系统如下所示:

each **User** belongs to many **Role**
each **Role** belongs to many **User**
用户、角色和角色用户部分之间的关系已经运行良好。但我不得不更改,并在每个表中添加一个Company字段,因为许多想尝试该程序的公司都会使用该字段

each **Company** has many **User**
each **User** belongs to **Company**
我尝试使用attach()如下:

each **User** belongs to many **Role**
each **Role** belongs to many **User**
客户控制员

 public function setupaccountcomplete($comp, $user){
    $comp_id = $comp;
    $user_id = $user;

    $updateData = [];
    $updateData['user_id'] = $user_id;
    $updateData['user_sex'] = Input::get('user_sex');
    $updateData['user_civilstatus'] = Input::get('user_civilstatus');
    $updateData['user_birthday'] = Input::get('user_bday');
    $updateData['user_birthplace'] = Input::get('user_bplace');
    $updateData['user_address'] = Input::get('user_address');
    $updateData['user_mobile'] = Input::get('user_mobile');
    $updateData['user_landline'] = Input::get('user_landline');
    $updateData['user_email'] = Input::get('user_email');
    $updateData['user_zip'] = Input::get('user_zip');
    $updateData['user_nationality'] = Input::get('user_nationality');
    $updateData['user_religion'] = Input::get('user_religion');
    $updateData['user_educAttain'] = Input::get('user_educAttain');
    $updateData['user_school'] = Input::get('user_school');
    $updateData['user_schooladdress'] = Input::get('user_schooladdress');
    $updateData['user_addedby'] = $user_id;

    $updatesql = DB::table('users')
        ->where('user_id', '=', $updateData['user_id'])
        ->update(['user_sex' => $updateData['user_sex'],
            'user_civilstatus' => $updateData['user_civilstatus'],
            'user_bday' => $updateData['user_birthday'],
            'user_bplace' => $updateData['user_birthplace'],
            'user_address' => $updateData['user_address'],
            'user_mobile' => $updateData['user_mobile'],
            'user_landline' => $updateData['user_landline'],
            'user_landline' => $updateData['user_landline'],
            'user_zip'=> $updateData['user_zip'],
            'user_religion'=> $updateData['user_religion'],
            'user_nationality' => $updateData['user_nationality'],
            'user_educAttain' => $updateData['user_educAttain'],
            'user_school' => $updateData['user_school'],
            'user_schooladdress' => $updateData['user_schooladdress'],
            'user_addedby' => $updateData['user_addedby']
            ]);

    $user = User::find($user_id);
    $user->roles()->attach(Role::where('role_desc', 'Superadmin')->first());

    return Redirect::route('setupcooperative', array('comp' => $comp_id, 'user' => $user_id));

}
使用myAccountController时,用户的角色id为“1”,但组件id为空

有人能帮我吗?我认为我在模型中的关系是错误的。另外,当我尝试执行这一行时,我得到了对undefined方法illumb\Database\Query\Builder::roles()的调用:

 $user->company()->roles()->attach(Role::where('role_desc', 'Superadmin')->first());

如Laravel文档中所述,
attach()
接受您正在附加的角色的ID,而不是角色本身:

$user->roles()->attach(Role::where('Role_desc','Superadmin')->first())

应该是:


$user->roles()->attach(Role::where('Role_desc','Superadmin')->get('id')->first())

如Laravel文档中所述,
attach()
接受您正在附加的角色的ID,而不是角色本身:

$user->roles()->attach(Role::where('Role_desc','Superadmin')->first())

应该是:


$user->roles()->attach(Role::where('Role_desc','Superadmin')->get('id')->first())

我得到一个BadMethodCallException:方法角色不存在。另外,您没有真正描述角色和公司之间的关系。我认为Company类上的roles()方法需要返回一个belongToMany。如Laravel文档所述,通过返回一个belongToMany()在两端定义多对多关系。如果公司和角色之间的关系不是很多,而是一个多,那么您将使用hasOne和hasMany来定义关系。很抱歉,要定义一个多的一面,请使用belongsTo(),而不是hasOne。我得到一个BadMethodCallException:方法角色不存在。另外,你没有真正描述角色和公司之间的关系。我认为Company类上的roles()方法需要返回一个belongToMany。如Laravel文档所述,通过返回一个belongToMany()在两端定义多对多关系。如果公司和角色之间的关系不是很多,而是一个多,那么您将使用hasOne和hasMany来定义关系。很抱歉,要定义一个多的一面,请使用belongsTo(),而不是hasOne。