Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Задача: я хочу удалять мне не нужную привелегию (разрешение на просмотр какой либо страницы) вместе со всеми данными, к кому она была привязана. админу, модеру, 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)
Не в сети
вот вечно так.. пол дня потеряешь, сделать не можешь, как вопрос задашь, так через 5 минут сам решаешь...
Permissions::find($id)->roles()->detach();
Permissions::find($id)->delete();
Не в сети
Можно ведь просто Permissions::find($id)->delete() сделать и в pivot таблице все данные, относящиеся к этому Permissions, будут автоматически удалены. Если конечно ты onDelete('cascade') используешь.
Не в сети
увы нет.. 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)
Не в сети
Спасибо. Если проект в продакшене, тогда нужно будет создать еще одну миграцию и добавить onDelete.
Не в сети
Страницы 1