db->tableExists('nav_items')) { return; } $existing = $this->db->table('nav_items')->where('url', $this->url)->get()->getRowArray(); if ($existing !== null) { return; } $parentColumn = $this->parentColumn(); $parentBuilder = $this->db->table('nav_items')->where('label', 'Student-Affairs'); if ($parentColumn !== null) { $parentBuilder->where($parentColumn, null); } $parent = $parentBuilder->get()->getRowArray(); $insert = [ 'label' => 'School Statistics', 'url' => $this->url, 'sort_order' => 14, 'is_enabled' => 1, 'created_at' => date('Y-m-d H:i:s'), ]; if ($parentColumn !== null) { $insert[$parentColumn] = $parent['id'] ?? null; } $this->db->table('nav_items')->insert($insert); $navItemId = (int) $this->db->insertID(); $this->grantToRoles($navItemId, ['administrator', 'admin', 'principal', 'vice_principal', 'administrative staff', 'head of department (education)']); } public function down(): void { if (! $this->db->tableExists('nav_items')) { return; } $row = $this->db->table('nav_items')->where('url', $this->url)->get()->getRowArray(); if ($row === null) { return; } if ($this->db->tableExists('role_nav_items')) { $this->db->table('role_nav_items')->where('nav_item_id', (int) $row['id'])->delete(); } $this->db->table('nav_items')->where('id', (int) $row['id'])->delete(); } private function grantToRoles(int $navItemId, array $roles): void { if ($navItemId <= 0 || ! $this->db->tableExists('role_nav_items')) { return; } foreach ($roles as $role) { $insert = ['nav_item_id' => $navItemId, 'created_at' => date('Y-m-d H:i:s')]; if ($this->db->fieldExists('role_id', 'role_nav_items') && $this->db->tableExists('roles')) { $roleRow = $this->db->table('roles')->select('id')->where('LOWER(name)', strtolower($role))->get()->getRowArray(); if ($roleRow === null) { continue; } $insert['role_id'] = (int) $roleRow['id']; } elseif ($this->db->fieldExists('role', 'role_nav_items')) { $insert['role'] = $role; } else { continue; } $this->db->table('role_nav_items')->insert($insert); } } private function parentColumn(): ?string { if ($this->db->fieldExists('parent_id', 'nav_items')) { return 'parent_id'; } return $this->db->fieldExists('menu_parent_id', 'nav_items') ? 'menu_parent_id' : null; } }