Красноречиво, удалите права пользователей из сводной таблицы - PullRequest
2 голосов
/ 07 мая 2019

У меня есть 3 таблицы: users; permissions; user_permissions.

Моя сводная таблица (user_permissions) имеет 2 столбца: user_id иmissions_id.

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

Так, например, я мог бы иметь:

array:1 [
  0 => "access_documentation"
]

Или я мог бы иметь это:

array:4 [
  0 => "general_user"
  1 => "access_pagespeed"
  2 => "access_documentation"
  3 => "access_admin"
]

У меня есть отношение к разрешениям пользователей, которое возвращает имена.

public function permissions()
{
    return $this->belongsToMany(Permission::class, 'user_permissions');
}

Что я основал на ответах, представленных ниже:

public function save(User $user, Request $request)
{

    $params = Permission::query()->whereIn('name', $request->input('data'));

    if ($params->count() === 0) {
        return;
    }

    $params = $params->pluck('id')->toArray();

     $user->permissions()->detach();

    // $user->permissions()->attach(6);
    // $user->permissions

}

Редактировать

Мои разрешения разделены на категории, поэтому при их обновлении я отправляю только массив разрешений для этой категории, поэтому выполнение $user->permissions()->detach() отсоединит несвязанные разрешения.

Есть ли способ, которым я могу сказать только отсоединить или синхронизировать все с определенным идентификатором категории?

Пример user_permissions

id      user_id      permission_id
1          32              1

Пример permissions

id        name      category_id
1      edit_users        3

** Редактировать 2 **

$params возвращает выбранные разрешения в этой категории, поэтому на основе изображения ниже будет массив [ 'general_user', 'access_pagespeed', 'access_admin' ]. Если бы я щелкнул четвертый пункт в списке ниже, тогда $params тогда, конечно, было бы [ 'general_user', 'access_pagespeed', 'access_admin', 'access_documentation' ].

enter image description here

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Есть несколько способов сделать это: Вариант 1:

Использование detach

Использование этого метода приведет к сбросу прав пользователя, значит, он удалит пользователяразрешения из этой таблицы путем установки значения разрешения равным нулю.

Дополнительную информацию можно получить по адресу: https://laravel.com/docs/5.8/eloquent-relationships#updating-many-to-many-relationships

Использование sync:

Использование этого методаудалит разрешения, которые не являются частью отправляемого массива, поэтому вы можете использовать это только для того, чтобы сохранить необходимые разрешения, а не удалять все разрешения.

Предположим, что у вашего пользователя есть следующие идентификаторы разрешений [1,2,3,4,5,6,7]

рассмотрите следующую строку кода: $user->roles()->sync([1, 2, 3]);

Это означает, что идентификаторы [1,2,3] будут сохранены в сводной таблице, а другие будут удалены.

Дополнительная информацияможно получить по адресу: https://laravel.com/docs/5.8/eloquent-relationships#updating-many-to-many-relationships

Я рекомендую вам использовать sync, поскольку вы можете оставить только необходимые разрешения.


Обновление: на основе обновлений, которые высделал на ваш вопрос, я сПредлагаем вам сделать следующее:

  • Добавьте дополнительный столбец к вашей таблице user_permissions и назовите его category_id, этот идентификатор категории должен совпадать с идентификатором категории ваших разрешений.

  • Используйте этот код $user->permissions()->wherePivot('category_id', 3)->detach();, это отменит все разрешения, связанные с идентификатором этой категории.

Полагаю, это решит вашу проблему.

1 голос
/ 07 мая 2019

В документации laravel говорится, что вы можете использовать метод detach на модели для автоматического удаления записей в сводной таблице:

https://laravel.com/docs/5.8/eloquent-relationships#updating-many-to-many-relationships

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...