belongsToMany(Admin::adminRoleModel(), 'admin_role_users', 'user_id', 'role_id')->withTimestamps(); } public function allMenus(): Collection { $model = Admin::adminMenuModel(); $allMenus = $model::all()->keyBy($this->getKeyName()); if ($this->isAdministrator()) { return $allMenus; } /** @var \Illuminate\Database\Eloquent\Collection */ $roleMenus = $this->roles ->pluck('menus') ->flatten() ->keyBy($this->getKeyName()); $allRoleMenus = $roleMenus->collect(); foreach ($roleMenus as $roleMenu) { if (is_null($roleMenu->parent_id) || $allRoleMenus->has($roleMenu->parent_id)) { continue; } $parent = $allMenus->get($roleMenu->parent_id); while ($parent) { $allRoleMenus->put($parent->id, $parent); if (is_null($parent->parent_id)) { break; } $parent = $allMenus->get($parent->parent_id); }; } unset($allMenus, $roleMenus); return $allRoleMenus; } }