findTopNavs($position); if ($topNavs->count() == 0) { return []; } $list = []; foreach ($topNavs as $nav) { $list[] = [ 'id' => $nav->id, 'name' => $nav->name, 'target' => $nav->target, 'url' => $nav->url, 'children' => $this->handleChildren($nav), ]; } return $list; } protected function handleChildren(NavModel $nav) { $subNavs = $this->findSubNavs($nav->id); if ($subNavs->count() == 0) { return []; } $list = []; foreach ($subNavs as $nav) { $list[] = [ 'id' => $nav->id, 'name' => $nav->name, 'target' => $nav->target, 'url' => $nav->url, ]; } return $list; } /** * @param int $navId * @return ResultsetInterface|Resultset|NavModel[] */ protected function findSubNavs($navId) { return NavModel::query() ->where('parent_id = :parent_id:', ['parent_id' => $navId]) ->andWhere('published = 1') ->orderBy('priority ASC') ->execute(); } /** * @param string $position * @return ResultsetInterface|Resultset|NavModel[] */ protected function findTopNavs($position) { return NavModel::query() ->where('position = :position:', ['position' => $position]) ->andWhere('level = 1 AND published = 1') ->orderBy('priority ASC') ->execute(); } }