2017-01-10 2 views
1

Я пытаюсь управлять ролями (начального) пользователя при регистрации в моем проекте с использованием Laravel 5.3. Я уже работал в первый раз, но мне пришлось добавить еще один стол, и теперь я потерялся.Как подключить несколько таблиц с разными отношениями и использовать attach() в Laravel 5.3

У меня есть 4 таблицы, компании, пользователя, Роль и стол поворота для пользователя и роль имени Role_Users


компании Таблица имеет comp_id

Таблица пользователя имеет comp_id, user_id

Роль Таблица имеет ROLE_ID, role_desc

Role_Users Таблица имеет comp_id, user_id, ROLE_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(); 
    } 
} 



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

} 


Компания Модель

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** 

Соотношение между частью пользователя, роли и роли Role_Users уже работает нормально. Но мне пришлось изменить и добавить поле Company в каждую таблицу, потому что оно будет использоваться многими компаниями, которые хотели бы попробовать программу.

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

Я пытаюсь использовать присоединять() так:

Контроллер счета

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 пуст.

Может кто-нибудь мне помочь? Я думаю, что мои отношения в модели ошибочны. Кроме того, я получаю призыв к неопределенным метод Осветите \ Database \ Query \ Builder :: ролей(), когда я пытаюсь сделать эту линию:

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

ответ

0

Как указано в документации Laravel, attach() принимает в Идентификатор роли, которую вы подключаете, а не саму роль:

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

+0

Я получаю BadMethodCallException: роли метода не существуют. – Eggnog654

+0

Кроме того, вы действительно не описываете отношения между Ролью и Компанией. Я думаю, что метод role() в классе Company должен возвращать имя принадлежит ToMany. Как указано в документах Laravel, отношения «многие-ко-многим» определяются с обоих концов, возвращая атрибут ownToMany(). https://laravel.com/docs/5.3/eloquent-relationships#many-to-many Если отношение между Компанией и Ролями не является Многим-Многим, и вместо этого одно-много, то вы будете использовать hasOne и hasMany для определения отношений. –

+0

Извините, чтобы определить одну сторону One-Many, используйте attributeTo(), а не hasOne. –

Смежные вопросы