select('discipline.DisciplineID, discipline.DisciplineCode, discipline.DisciplineName, discipline.SiteID, discipline.Parent, d.DisciplineCode as ParentCode,d.DisciplineName as ParentName') ->join('discipline as d', 'd.DisciplineID = discipline.Parent', 'left'); if (!empty($filter['DisciplineCode'])) { $builder->like('DisciplineCode', $filter['DisciplineCode'], 'both'); } if (!empty($filter['DisciplineName'])) { $builder->like('DisciplineName', $filter['DisciplineName'], 'both'); } $rows = $builder->findAll(); // Build nested structure: parent with children $parents = []; $children = []; foreach ($rows as $row) { if (empty($row['Parent'])) { $parents[$row['DisciplineID']] = $row; $parents[$row['DisciplineID']]['children'] = []; } else { $children[$row['Parent']][] = $row; } } // Attach children to parents foreach ($children as $parentId => $childList) { if (isset($parents[$parentId])) { $parents[$parentId]['children'] = $childList; } } // Return as indexed array return array_values($parents); } }