Отключение каждой записи модели в сводной таблице при удалении модели - PullRequest
0 голосов
/ 05 мая 2019

Представьте, что у меня есть модели User и Role.Теперь я занимаюсь удалением нескольких пользователей из базы данных.Например, я удаляю пользователей с идентификаторами 1, 2, 3 и 4. Теперь я хочу удалить все из сводной таблицы, где user_id = 1, 2, 3 или 4. Каков наилучший способ сделать это?Я имею в виду реализацию laravel.

Ответы [ 3 ]

0 голосов
/ 05 мая 2019

Вы можете подключиться к событию удаления в пользовательской модели, чтобы также удалить свою роль.

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();
}
0 голосов
/ 08 мая 2019

Добавьте этот cole в моделях для удаления регистров очистки пользователей или ролей в сводной таблице.

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();
    });
}
0 голосов
/ 05 мая 2019

если у пользователей и ролей много-много связей, просто работайте, как показано ниже, для вашей проблемы

Вот примеры кодов 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();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...