删除模型时,请分离数据透视表中模型的每个记录

时间:2019-05-05 16:35:00

标签: php mysql laravel relationship

想象一下我有UserRole模型。现在,我正在从数据库中删除多个用户。例如,我删除ID为1、2、3和4的用户。现在,我想从数据透视表中删除其中user_id = 1、2、3或4的所有内容。最好的方法是什么?我的意思是laravel实现。

3 个答案:

答案 0 :(得分:0)

如果用户和角色之间存在许多关系,那么请按照以下方式解决您的问题

这是示例代码 User.php

class User extends Authenticatable implements CanResetPassword
{
  protected $table = "users";

 public function roles(){
  return $this->belongsToMany(Role::class,'role_user');
 }
}

Role.php

class Role extends Model{
  protected $table = "roles";

 public function users(){
  return $this->belongsToMany(User::class,'role_user');
 }
}

您可以在控制器中执行此操作

class AnyTestController extends Controller{
  public function test(){
   //Suppose your user id is 1 then delete user from pivot table 
   $user = User::find(1);
   $user->roles()->detach();
   $user->delete();
   }
}

答案 1 :(得分:0)

您可以加入用户模型上的delete事件,以删除其角色。

User.php

Class User extends Model {

    protected static function boot() {
        static::deleting(function($model) {
             // Whenever we delete a user delete their roles first.
             $model->roles()->sync([]);
        });

    }

    function roles() {
        return $this->belongsToMany('roles');
    }
}

您还可以使用模型事件和观察者来执行此操作,这可能会更简洁一些:https://laravel.com/docs/5.8/eloquent#events。观察者和上述模式的问题在于,每当您批量删除时,都会遇到n + 1问题。

如果要批量删除用户,最有效的方法是手动从数据透视表中删除数据,如下所示:

function deleteUsers($userIds) {
    // Delete the users roles
    DB::('user_roles')
        ->whereIn('user_id', $userIds)
        ->delete();

    // Delete the users
    User::whereIn('id', $userIds)
        ->delete();
}

答案 2 :(得分:0)

将此模型添加到模型中,然后再删除数据透视表中的用户或角色清除寄存器。

User.php

protected static function boot ()
{
    parent::boot();

    static::deleting (function ($user) {
        $user->roles()->detach();
    });
}

Role.php

protected static function boot ()
{
    parent::boot();

    static::deleting (function ($role) {
        $role->users()->detach();
    });
}