Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 02.11.2017 12:29:43

Многие ко многим. Удаление.

Задача: я хочу удалять мне не нужную привелегию (разрешение на просмотр какой либо страницы) вместе со всеми данными, к кому она была привязана. админу, модеру, 3м юзерам и собаке..

Таблица permissions (id,name)

    public function roles(){
        return $this->belongsToMany('Corp\Role','permission_role');
    }

Таблица roles (id,name)

   public function perm(){
        return $this->belongsToMany('Corp\Permissions', 'permission_role');
    }

Связующая таблица permission_role (id,role_id,permissions_id)

        Schema::table('permission_role', function (Blueprint $table) {
            $table->integer('role_id')->unsigned()->default(1);
            $table->foreign('role_id')->references('id')->on('roles'); // references - указывает на какое поле ссылается данный идентификатор. мы ссылаемся на id и указываем какой таблицы.

            $table->integer('permission_id')->unsigned()->default(1);
            $table->foreign('permission_id')->references('id')->on('permissions');
        });

Сохранение привилегии (просмотр страницы админа) для определенной роли(модератора) происходит с помощью метода "sync".
"sync" - Реализует синхронизацию связанных моделей через связующую таблицу. т.е. если какое-то поле скрыли за ненадобностью и отправили и оно не попало в реквест, то данные по этому полю будут удалены.

Метод удаления:
    public function destroy(59)
    {
        $res = Permissions::find(59);
        $res = $res->roles()->sync(59);

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

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`corporate`.`permission_role`, CONSTRAINT `permission_role_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`)) (SQL: insert into `permission_role` (`permissions_id`, `role_id`) values (59, 59))

т.е. было:
идАдмин привилегия59
идМодер привилегия59
идСобака привилегия59

и пытается заинсертить
привилегия59 привилегия59

притом запись в удаляемой привилегии так и осталась в таблице permissions
ни до какого $res->delete(); дело не доходит..

Изменено sam (02.11.2017 13:20:48)

Не в сети

#2 02.11.2017 13:07:16

Re: Многие ко многим. Удаление.

вот вечно так.. пол дня потеряешь, сделать не можешь, как вопрос задашь, так через 5 минут сам решаешь...
Permissions::find($id)->roles()->detach();
Permissions::find($id)->delete();

Не в сети

#3 02.11.2017 14:40:16

Re: Многие ко многим. Удаление.

Можно ведь просто Permissions::find($id)->delete() сделать и в pivot таблице все данные, относящиеся к этому Permissions, будут автоматически удалены. Если конечно ты onDelete('cascade') используешь.

Не в сети

#4 02.11.2017 15:17:28

Re: Многие ко многим. Удаление.

увы нет.. onDelete('cascade') я упустил. нужно будет както поправить миграциями..
кстати клевая ссылочка в подписях)
П.С. да, по ссылке создал миграцию и все стало норм работать. код сократился до:

    public function destroy($id)
    {
        if (\Gate::denies('ADMIN', new \Corp\User)) {
            abort(403);
        }
        if (Permissions::find($id)->delete()) {
            return redirect('admin/permiss/index')->with(Session::flash('status', 'Привилегия Удалена!'));
        }
        return redirect('admin/permiss/index')->with(Session::flash('error', 'Не возможно удалить привилегию!' . ' ID ' . $id));
    }

Изменено sam (02.11.2017 16:46:57)

Не в сети

#5 02.11.2017 15:27:46

Re: Многие ко многим. Удаление.

Спасибо. Если проект в продакшене, тогда нужно будет создать еще одну миграцию и добавить onDelete.

https://laravel.ru/docs/v5/migrations#ограничения

Не в сети

Подвал раздела