简体   繁体   English

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

[英]How to connect multiple tables with different relations and use attach() in Laravel 5.3

I'm trying to manage the roles of the (initial) user upon sign up in my project using Laravel 5.3. 我正在尝试使用Laravel 5.3在我的项目中注册时管理(初始)用户的角色。 I have already got it working the first time but I had to add another table and now I'm lost. 我已经让它第一次工作,但我不得不添加另一张桌子,现在我迷路了。

I have 4 tables, Company , User , Role and a pivot table for the User and Role named Role_Users 我有4个表, 公司用户角色和名为Role_Users的用户和角色的数据透视表


Company Table has comp_id 公司表comp_id

User Table has comp_id , user_id 用户表comp_iduser_id

Role Table has role_id , role_desc 角色表具有role_idrole_desc

Role_Users Table has comp_id , user_id , role_id Role_Users表具有comp_iduser_idrole_id



User Model 用户模型

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();
    }
}



Role Model 榜样

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();
    }

}


Company Model 公司模式

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();
    }
}


The system goes like this: 系统是这样的:

each **User** belongs to many **Role**
each **Role** belongs to many **User**

The relation between the User, Role and Role_Users part has already been working fine. 用户,角色和Role_Users部分之间的关​​系已经正常工作。 But I had to change and add a Company field to each table because it will be used by many company who'd like to try the program. 但是我不得不改变并在每个表中添加一个公司字段,因为它将被许多想要尝试该程序的公司使用。

each **Company** has many **User**
each **User** belongs to **Company**

I'm trying to use attach() like this: 我试图像这样使用attach()

Account Controller 账户管理员

 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));

}

With my AccountController the user has a role_id of "1" but the comp_id is empty. 使用我的AccountController ,用户的role_id为“1”,但comp_id为空。

Can someone help me? 有人能帮我吗? I think my relations in the model is wrong. 我认为我在模型中的关系是错误的。 Also, I am getting a Call to undefined method Illuminate\\Database\\Query\\Builder::roles() when I try to do this line: 此外,当我尝试执行此行时,我正在调用未定义的方法Illuminate \\ Database \\ Query \\ Builder :: roles()

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

As stated in the Laravel docs, attach() takes in the ID of the role you are attaching, not the Role itself: 如Laravel文档中所述, attach()接受您要附加的角色的ID,而不是角色本身:

https://laravel.com/docs/5.3/eloquent-relationships#updating-many-to-many-relationships https://laravel.com/docs/5.3/eloquent-relationships#updating-many-to-many-relationships

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

should be: 应该:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM