更新 laravel 8 中的复选框值(blade/ controller )
update checkbox value in laravel 8 (blade/ controller )
我是 laravel 的初学者,我想更新数据库中的多个复选框 ..
当我自动点击更新按钮时,我的输入显示旧值,我的权限也被旧值检查以更新它..
用户和权限之间的关系是多对多的。我有另一个 table 命名的用户权限,他有 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é !');
}
感谢提前!
$user->userPermissions()->save($request->input('data'));
这里要理解的一件重要事情是,关系上的 save() 不会从数据透视表 table 中删除旧值,它只是向其中添加更多值(无区分检查)。您需要类似刷新功能的东西。看attaching\detaching or 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 属性,您可以将其与权限进行比较。
希望您得到主要想法和信息对您有用!
我是 laravel 的初学者,我想更新数据库中的多个复选框 .. 当我自动点击更新按钮时,我的输入显示旧值,我的权限也被旧值检查以更新它..
用户和权限之间的关系是多对多的。我有另一个 table 命名的用户权限,他有 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é !');
}
感谢提前!
$user->userPermissions()->save($request->input('data'));
这里要理解的一件重要事情是,关系上的 save() 不会从数据透视表 table 中删除旧值,它只是向其中添加更多值(无区分检查)。您需要类似刷新功能的东西。看attaching\detaching or 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 属性,您可以将其与权限进行比较。
希望您得到主要想法和信息对您有用!