Laravel вставлять и обновлять отношения "многие ко многим" между тремя таблицами - PullRequest
0 голосов
/ 16 июня 2020

У меня следующая структура таблицы:

Таблица пользователей

user_id
username
password

Таблица ролей

role_id
role_name

Таблица окружений

environment_id
environment_name

и иметь сводную таблицу для сохранения отношения следующим образом

Таблица User_Roles_Environments

user_id
role_id
environment_id

Пользователям можно назначить несколько ролей и добавить их в несколько сред.

Я добавил следующие отношения к классам модели

Environment. php

public function roles() {
    return $this->belongsToMany(
        'App\Models\Role',
        'user_roles_environments'
    )->withPivot('user_id');
}

 public function users(){
     return $this->belongsToMany(
         'App\Models\User',
         'user_roles_environments'
     )->withPivot('role_id');
 }

Пользователь. php

public function environments(){
    return $this->belongsToMany(
        'App\Models\Environment',
        'user_roles_environments'
    )->withPivot('role_id');
}

public function roles()
{
    return $this->belongsToMany(
        'App\Models\Role',
        'user_roles_environments'
    )->withPivot('environment_id');
}

Роль. php

public function environments() {
    return $this->belongsToMany(
        'App\Models\Environment',
        'user_roles_environments'
    )->withPivot('user_id');
}

public function users() {
    return $this->belongsToMany(
        'App\Models\User',
        'user_roles_environments'
    )->withPivot('environment_id');
}

Теперь, Это правильный способ определения отношений в соответствии со структурой таблицы? Когда я сохраняю пользователя, я даю соответствующие role_ids (можно выбрать несколько ролей) и environment_ids (можно выбрать несколько сред). Я попробовал следующий код, чтобы установить связь.

foreach($request->input('user_roles') as $userRole) {
     $user->roles()->attach($userRole);
 }
 foreach($request->input('user_role_environments') as $userEnvironment) {
     user->environments()->attach($userEnvironment);
 }

где ввод дает role_ids и environment_ids. Но я получаю следующую ошибку SQL:

сообщение: «SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'role_role_id' в 'списке полей' (SQL: вставить в user_roles_environments (role_role_id, user_user_id) значения (ROLE_ID, 0))

Здесь отображаются только два поля. Как мне добавить к нему environment_id?

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Попробуйте передать пользовательские имена столбцов, которые могут быть внутри таблицы.

Примерно так (взято из здесь ):

return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');
0 голосов
/ 16 июня 2020

Итак, я предполагаю, что количество пользовательских ролей совпадает с количеством сред. Я подсчитаю количество пользовательских ролей и воспользуюсь этим счетчиком для l oop. В l oop я могу использовать счет как предел моего l oop. Это должно решить вашу проблему.

$user_role_count=count($request->input('user_roles'));

for($i=0;$i<$user_role_count;$i++){

$user->roles()->attach($request->user_roles[$i],['environment_id' => $request->user_role_environments[$i]]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...