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