modelName = Admin::adminRoleModel(); } public function list() { $query = $this->listQuery(); /** @var \Illuminate\Pagination\LengthAwarePaginator */ $list = $query->with(['menus', 'permissions'])->paginate(request()->input('perPage', 20)); $list->through(function ($item) { $instance = $item->withoutRelations(); $instance->setAttribute('menu_ids', $item->menus->pluck('id')); $instance->setAttribute('permission_ids', $item->permissions->pluck('id')); return $instance; }); $items = $list->items(); $total = $list->total(); return compact('items', 'total'); } public function store($data): bool { $this->checkRepeated($data); $columns = $this->getTableColumns(); $model = $this->getModel(); foreach ($data as $k => $v) { if (! in_array($k, $columns)) { continue; } $model->setAttribute($k, $v); } return $model->save(); } public function update($primaryKey, $data): bool { $this->checkRepeated($data, $primaryKey); $columns = $this->getTableColumns(); $model = $this->query()->whereKey($primaryKey)->first(); foreach ($data as $k => $v) { if (! in_array($k, $columns)) { continue; } $model->setAttribute($k, $v); } return $model->save(); } public function checkRepeated($data, $id = 0) { $query = $this->query()->when($id, fn ($query) => $query->where('id', '<>', $id)); amis_abort_if($query->clone() ->where('name', $data['name']) ->exists(), __('admin.admin_role.name_already_exists')); amis_abort_if($query->clone() ->where('slug', $data['slug']) ->exists(), __('admin.admin_role.slug_already_exists')); } public function savePermissions($primaryKey, $permissions): void { $model = $this->query()->whereKey($primaryKey)->first(); $model->permissions()->detach(); $model->permissions()->attach($permissions); } public function saveMenus($primaryKey, $menus): void { $model = $this->query()->whereKey($primaryKey)->first(); $model->menus()->detach(); $model->menus()->attach($menus); } }