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;
}