【问题标题】:update checkbox value in laravel 8 (blade/ controller )更新 laravel 8 中的复选框值(刀片/控制器)
【发布时间】:2021-12-18 16:07:30
【问题描述】:

我是 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é !');
}

感谢您的提前!

【问题讨论】:

    标签: php checkbox laravel-8 updatecheck


    【解决方案1】:
    $user->userPermissions()->save($request->input('data'));
    

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

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

    // 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 个问题)。你可以preload/eager load userPermissions 而不是通过在你的用户模型中声明关系来动态加载它们

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

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

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

    【讨论】:

    • 感谢谢尔盖,它运作良好!是的,我会阅读文档..
    猜你喜欢
    • 2016-09-14
    • 2015-01-14
    • 1970-01-01
    • 2020-10-18
    • 2021-10-28
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多