Методы модели Category (Yii2).

Avron2

Новичок
Изучаю Yii2. Есть модель Active Record 'Category'. В ней незатейливый код для работы с вложенными категориями (nested sets). Все работает. Ткните на недочеты. Чувствую что запись по id можно вернуть гораздо элегантнее, без where.

PHP:
    /**
     * Does category has parent categories?
     * @param $id
     * @return boolean
     */
    private static function hasParent($id)
    {
        if($id == 0) return false;
        $parent_id = self::find()->select('id')->where(['parent_id'=>$id])->scalar();
        return boolval($parent_id);
    }

    /**
     * Returns data of all parent elements in the array.
     * Array elemets sort from parent element of $id to root element (id=0)
     * @param $id
     * @return array
     */
    public static function getAllParents($id)
    {
        if(!Category::hasParent($id)) return false;

        $parents = [];
        $i = 0;
        //get id of nearest parent
        $id = Category::find()->select('parent_id')->where(['id'=> $id])->scalar();
        while(Category::hasParent($id))
        {
            $parents[$i] = Category::find()->asArray()->where(['id'=> $id])->one();
            //each next parent_id
            $id = $parents[$i]['parent_id'];
            $i++;
        }

        return $parents;
    }

    /**Creates an array of breadcrumbs.
     * Each element has this form [[label=>url],..,[],..,[]]
     * @param $id
     * @return array
     */
    public static function getBreadCrumbs($id)
    {
        $parents = Category::getAllParents($id);
        //If this is root element we add its without links
        if (!$parents) return [self::find()->select('category')->where(['id'=>$id])->scalar()];

        $parents = array_reverse($parents);
        $breadcrumbs = [];
        foreach ($parents as $cat)
        {
            $breadcrumbs[] = ['label'=>$cat['category'], 'url'=>Url::to(['index','cat_id'=>$cat['id']])];
        }
        $breadcrumbs[]=Category::find()->select('category')->where(['id'=>$id])->scalar();
        return $breadcrumbs;
    }
Спасибо!
 
Сверху