Laravel: получить категорию основного уровня в дереве родительско-дочерних отношений - PullRequest
0 голосов
/ 03 августа 2020

У меня многоуровневая модель категории, каждая категория может иметь дочерние элементы и родительский элемент в одной таблице (древовидной структуре) в одной и той же sql таблице.

public function childs(){
return $this->hasMany('App\Category', 'parent_id', 'id');
}

public function parent(){
return $this->belongsTo('App\Category', 'parent_id');
}

+---------+---------+------------+
| id      |cat_name | parent_id  | 
+---------+---------+------------+
|       1 |     A   | NULL       |
|       2 |     B   | NULL       |
|       3 |     AA  | 1          |
|       4 |     BB  | 2          |
|       5 |     AAA | 4          |
+---------+---------+------------+

С моего контроллера я хочу получить все категории с их основной категорией (не родительской категорией), например:

 $categories= Category::with('mainCategory')->get();

Желаемый результат

id: 1
cat_name: A
parent_id:null
mainCategory:{}

id: 2
cat_name: B
parent_id:null
mainCategory:{}

id: 3
cat_name: AA
parent_id:1
mainCategory:{
             id: 1
             cat_name: A
             parent_id:NULL
             }

id: 4
cat_name: BB
parent_id:2
mainCategory:{
             id: 2
             cat_name: B
             parent_id:NULL
             }


id: 5
cat_name: AAA
parent_id:3
mainCategory:{
             id: 1
             cat_name: AAA
             parent_id:NULL
             }

Например: категория AAA с id 5 -> mainCat - A

Мне нужна модельная функция, которая возвращает категории и mainCategory для каждой из них, поэтому я могу применить функцию с другого контроллера, а не с CategoryController.

1 Ответ

0 голосов
/ 03 августа 2020

Я понимаю ваш вопрос.

создать две таблицы для родительской и дочерней, потому что родительская категория имеет много дочерних категорий

Примеры таблиц

Табель родительских категорий

id, name

Таблица дочерних категорий

id, parent_category_id

И также создать две модели

ParentCategoryModel

public function childs(){ return $this->hasMany(ChildCategoryModel::class, 'parent_category_id', 'id'); }

ChildCategoryModel

public function parent(){ return $this->belongsTo(ParentCategoryModel::class,'parent_category_id')->withDefault(); }

Внутри вашего контроллера вы можете использовать красноречие, как это categories=ChildCategoryModel::with('parent')->get();

...