Laravel 5 updateOrCreate(或删除)

时间:2018-03-12 06:47:53

标签: laravel laravel-5

我有一个设置,我有一个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类解决了我的问题,当涉及到更新旧行或创建新行时,问题是,删除行。它无法删除行。

我需要删除数据库中存在的行,并在请求中丢失。

最好的方法是什么?

2 个答案:

答案 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