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

标签 php mysql laravel relation multiple-tables

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

我有 4 个表,CompanyUserRole 和一个用于用户和角色的数据透视表名为Role_Users


公司表comp_id

用户表comp_iduser_id

角色表role_idrole_desc

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


系统是这样的:

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

User、Role 和 Role_Users 部分之间的关​​系已经正常工作。但我不得不更改并向每个表添加一个公司字段,因为它会被许多想试用该程序的公司使用。

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

我正在尝试像这样使用 attach():

账户管理员

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

}

在我的 AccountController 中,用户的 role_id 为“1”,但 comp_id 为空。

有人可以帮助我吗?我认为我在模型中的关系是错误的。此外,当我尝试执行此行时,我收到了一个 Call to undefined method Illuminate\Database\Query\Builder::roles():

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

最佳答案

如 Laravel 文档中所述,attach() 获取您要附加的角色的 ID,而不是角色本身:

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

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

应该是:

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

关于php - 如何连接具有不同关系的多个表并在 Laravel 5.3 中使用 attach(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41573368/

相关文章:

php - DATEDIFF 和 NOW() mysql_fetch_array 错误

PHP/MYSQL 需要 SQL Join 吗?

php - 从 Laravel 集合中获取单个模型

PHP Laravel : How to logout from other device with same userId forcefully

php - 连接保活问题

php - 尝试为 NVD3 图表创建 JSON 代码

mysql - 如何向 MySQL 中的现有列添加非空约束

php - 在 laravel 中访问 href 参数

php - 获取所有记录json_encode

php - SQL 使用 replace() 选择 LIKE 结果和精确结果