Вот такая функция возвращает всё дерево в виде многомерного массива с добавлением parent_id каждому элементу для удобства. Работает с любым количеством деревьев и любой степенью вложенности.
Далее из этого массива можно что угодно нарисовать.
Если в вашей таблице используется под уровни 'depth' вместо 'lvl', поменяйте
$l = $node['lvl']; на $l = $node['depth']; Соответственно также $r = $node['root']; на $r = $node['tree'], если вместо 'root' в базе 'tree'.
Если таблица без использования множества деревьев, тогда $r = 1;
Используется один запрос к базе. Перебор уровня вложенности можно менять с помощью $level.
$category = CategoryMenu::find()->orderBy('root, lft')->indexBy('id')->asArray()->all();
function getTree($category, $level = 0) {
$tree = []; $_id = [];
foreach ($category as $id=>&$node) {
$l = $node['lvl']; $p = $l-1; $r = $node['root']; $_id[$r][$l] = $id;
if ($l == $level) {
$tree[$id] = &$node;
} elseif ($l > $level) {
$category[$_id[$r][$p]]['childs'][$id] = &$node;
$node['parent_id'] = $category[$_id[$r][$p]]['id'];
}
}
return $tree;
}