我有一个设置,我有一个user_roles表。
然后管理员将能够通过添加新角色,更新旧角色的名称以及最后删除来更新这些角色。
------------------
| id | user_role |
| 1 | admin |
| 2 | role 1 |
| 3 | role 3 |
------------------
我尝试使用此代码块来更新,添加,删除角色
public function update(Request $request, $id){
$roles = Model::all();
foreach($roles as $role){
$role->delete();
}
foreach($request->role as $role){
$role = new Model;
$role->user_role = $role;
$role->save();
}
}
但是在users表中,我有一个user_role列引用了user_roles表的id,所以每当我使用上面的代码时,所有行都将被删除,然后将为插入的新行创建一个新的id 。因此,当我返回用户列表时,他们的user_role列将返回null,因为每个用户都有一个不存在的user_role id。
使用updateOrCreate
类解决了我的问题,当涉及到更新旧行或创建新行时,问题是,删除行。它无法删除行。
我需要删除数据库中存在的行,并在请求中丢失。
最好的方法是什么?
答案 0 :(得分:0)
我已使用maslauskast @ https://laracasts.com/discuss/channels/laravel/updateorcreate-rows-from-a-csv-or-delete-if-not-on-the-csv?page=0
提出的 id 方法解决了此问题您的解决方案*将是
public function update(Request $request, $id){
$usersRoleToDelete = Model::all()->pluck('id', 'id');
foreach($request->role as $role) {
$createdOrUpdated = Model::createOrUpdate(['user_role' => $role]);
if (!empty($usersRoleToDelete[$createdOrUpdated->id])) {
unset($usersRoleToDelete[$createdOrUpdated->id]);
}
}
if (count($usersRoleToDelete)) {
Model::whereRaw(sprintf('id IN (%s)', implode(',', $usersRoleToDelete)))->delete();
/* Alternatively you could use
* Model::whereIn('id', $usersRoleToDelete)->delete();
* if the amount of ids is smaller than the maximum PDO arguments allowed
*/
}
}
答案 1 :(得分:0)
这是我在Laravel 5.3中基于Adrian答案的工作updateOrCreate方法
BigInt("466933532930080768") // --> 466933532930080768n