想象一下我有User
和Role
模型。现在,我正在从数据库中删除多个用户。例如,我删除ID为1、2、3和4的用户。现在,我想从数据透视表中删除其中user_id = 1、2、3或4的所有内容。最好的方法是什么?我的意思是laravel实现。
答案 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();
});
}