Laravel 6: как отправить user_id с role_id (s) на контроллер, чтобы синхронизировать c сводную таблицу user_role? - PullRequest
0 голосов
/ 18 февраля 2020

Я довольно новичок в Laravel и мне нужна помощь. Я создаю страницу администратора, где пользователям могут быть назначены несколько ролей с помощью флажков. У меня есть обычные отношения «многие ко многим» и сводная таблица «role_users» с двумя столбцами: role_id и user_id. Различные роли пользователей отображаются нормально, но у меня проблемы с функцией обновления. Моя форма отправляет массив ролей на admincontroller@update, но, конечно, они должны быть связаны с пользователями - и я не могу понять, как это сделать.

Вот моя форма:


        <form method="POST" action="{{ route('admin.update') }}" enctype="multipart/form-data">
        {{ csrf_field() }}
        <table>
            <thead>
                <th>Name</th>
                <th>Email</th>
                @foreach ($roles as $role)
                <th>{{ $role->name }}</th>
                @endforeach
            </thead>
            <tbody>
                @foreach ($users as $user)
                <tr>
                    <td>{{ $user->name }}</td>
                    <td>{{ $user->email }}</td>
                    <input type="hidden" name="user[]" value="{{ $user->id }}">
                    @foreach($roles as $role)
                        <td><input type="checkbox" name="roles[]" value={{ $role->id }}
                            @if (in_array($role->id, $user->roles->pluck('id')->toArray() ))
                                checked ="1"
                            @endif />
                        </td>
                    @endforeach
                </tr>
                @endforeach
            </tbody>
        </table>
        <input type="submit" class="tableSubmit" value="Update" />

Вот мой метод обновления:

    public function update(Request $request, $id) {

        $id = $request->input('user');
        $user = User::with('roles')->find($id);
        $user->roles()->sync(($request->roles), false);

        return redirect('/admin');
    }

Все это выдает ошибку: «Метод Illuminate \ Database \ Eloquent \ Collection :: role не существует». Но, конечно, у меня есть метод role () в моей модели User:

    public function roles() {
        return $this->belongsToMany('App\Role');
    }

Как мне пройти user_id с идентификаторами ролей, чтобы метод syn c работал? Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

Вот мой пересмотренный метод обновления. Вроде работает. Интересно, есть ли более элегантное решение, которое не нуждается в «foreach»?

    public function update(Request $request) {

        $users = (array_keys($request->roles)); // gets the user ids

        foreach($users as $u) {
            $user = User::find($u);
            $user->roles()->sync(array_values($request->roles[$u]));
        }

        return redirect('/admin');
    }
}
0 голосов
/ 18 февраля 2020

Ваша проблема в том, что вы используете метод with непосредственно для коллекции, правильный путь:

$user = User::where('id',$id)->with('roles')->first();

Надеюсь, что это работает!

РЕДАКТИРОВАТЬ:

Не уверен, почему после массива внутри метода syn c стоит "false", попробуйте изменить его на:

$user->roles()->sync($request->roles);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...