0

我是laravel的初学者,我想更新数据库中的多个复选框..当我自动单击更新按钮时,我的输入显示旧值,我的权限也被旧值检查以更新它..

用户和权限之间的关系是多对多的。我有另一个名为 userpermissions 的表,它有 id_user 和 id_permission

这是我在(edit.blade.php)中的更新表格

<form action="{{ url('users/'.$user->id) }}" method="POST">
                                    @csrf
                                    @method('PUT')
                                    <div class="row">
                                        <div class="col-md-6">
                                            <div class="form-group">
                                                <label>Name</label>
                                                <input type="text" name="name" id="name" required class="form-control" value="{{ $user->name }}">
                                                @error('name')
                                                    <ul class="alert"><li class="text-danger">{{ $message }}</li></ul>
                                                @enderror
                                            </div>
                                        </div>
                                        <div class="col-md-6">
                                            <div class="form-group">
                                                <label>Email</label>
                                                <input type="email" name="email" id="email" required class="form-control" value="{{ $user->email }}">
                                            </div>
                                        </div>
                                        <div class="col-md-12">
                                            <div  class="form-group">
                                            @foreach($permissions as $permission)
                                                <input type="checkbox" name="data[]" value="{{ $permission->id }}"
                                                <?php if( in_array($permission->id, $user->userPermissions->pluck('permission_id')->toArray())){ echo 'checked="checked"'; } ?>/>
                                               {{ $permission->name }}
                                                @if($loop->iteration % 3 == 0 ) <br> @else @endif
                                                @endforeach
                                            </div>
                                        </div>

                                    </div>
                                    <div class="text-right mt-4">
                                        <button type="submit" class="btn btn-primary"> Add</button>
                                    </div>
                                </form>

这是我的控制器,我认为方法有问题:

编辑功能

 public function edit(User $user)
{
    $permissions = Permission::get();
    return view('users.edit', compact('user','permissions'));
}

更新功能:

public function update(UserRequest $request,User $user)
{
    $user->update(
        $request->only('name', 'email')
    );
    $user->userPermissions()->save($request->input('data'));
    return redirect()->back()->with('status','user updated !');
}

这是我的功能商店:

public function store(UserRequest $request)
{
    $this->validate($request, [
        'name' => 'required',
        'email'=>'required|email',
        'password' => 'required|confirmed|min:6',
    ]);
    $user = User::create(
        $request->only('name', 'email', 'password')
    );
    $user->userPermissions()->createMany($request->input('data'));
    return redirect()->back()->with('status','Utilisateur ajouté !');
}

感谢提前!

4

1 回答 1

0
$user->userPermissions()->save($request->input('data'));

这里要理解的一件重要的事情是关系上的save()不会从数据透视表中删除旧值,它只是向它添加更多值(没有区别检查)。您需要类似刷新功能的东西。查看attaching\detachingsync,第二个更方便。

在第一种情况下,您可以在保存权限之前执行此操作

// remove all old permissions
$user->userPermissions()->detach();
// update them with new one
$user->userPermissions()->attach($request->input('data'));

在第二种情况下,它比第一种更简洁,您只需将权限数组传递给用户对象。

// this will do both things which we did before
$user->userPermissions()->sync($request->input('data'))

但我鼓励您阅读文档并在之后提出问题;)

我看到的另一件事与当前主题无关的是

$user->userPermissions->pluck('permission_id')->toArray()

您在 foreach 循环中使用延迟加载,这意味着在循环的每次迭代中,您都在对数据库进行查询(N + 1 个问题)。您可以预先加载/急切加载userPermissions 而不是通过在您的 User 模型中声明这样的关系来即时加载它们

class User extends Model
{
    /**
     * The relationships that should always be loaded.
     *
     * @var array
     */
    protected $with = ['userPermissions'];
    ...
}

然后在您的User对象中将具有userPermissions属性,您可以将其与权限进行比较。

希望你得到主要的想法和信息对你有用!

于 2021-11-04T19:18:37.930 回答