Как получить данные с помощью рекурсии?
В модели category сделал виртуальное свойство
public $childs;
в модели/**
     * Строим дерево категории
     *
     * @param $data
     * @param int $rootID
     * @return array
     */
    protected function buildTree($data, $rootID = 0)
    {
        $tree = [];
        foreach ($data as $id => $node) {
            if ($node['parent_id'] == $rootID) {
                unset($data[$id]);
                $node['childs'] = $this->buildTree($data, $node['id']);
                $tree[] = $node;
            }
        }
        return $tree;
    }

    /**
     * Получаю все категории
     *
     * @return array
     */
    public function getAllCategories()
    {
        $data = Category::find()->asArray()->all();
        return $this->buildTree($data);
    }
в controller$tree = $model->getAllCategories();
return $this->render('profile', ['tree' => $tree]);
во viewforeach ($tree as $cat) {
// root 1-й уровень
    echo $cat['title'];
    if ($cat['childs'] > 0) {
        foreach ($cat['childs'] as $childs) {
// category 2-й уровень
            if (empty($childs['childs'])) {
                echo  $childs['title'];
            } else {
                echo '<b><br/>' . $childs['title'] . '</b><br/>';
            }
            foreach ($childs['childs'] as $child) {
// category 3-й уровень
                echo $child['title'];
            }
        }
    }
    echo '</div>';
}
Решение для любого уровня)public function getChildById($arr, $id) {
			if(is_array($arr)){
				if((string)$arr[0]['_id'] == $id){
					return $arr;
				}else {
					foreach ($arr as $kay => $value) {
						return $this -> getChildById($value['childs'], $id);
					}
				}
			}
			return  false;
		}