Я хочу получить все сообщения выбранной категории и всех вложенных подкатегорий. Я имею в виду что-то вроде этого:
[id= 1]-Category 1
[id= 7]--Category 1.1
[id=12]---Category 1.1.1
[id=13]---Category 1.1.2
[id= 9]--Category 1.2
[id= 3]-Category 2
Сначала я попытался рекурсивно получить все идентификаторы выбранной категории и все вложенные подкатегории, а затем извлечь сообщения с идентификаторами этих категорий.
Я написал метод getSubcategoriesIds($category)
в контроллере, который фактически дает мне то, что я хочу, но возвращает массив с дублированными идентификаторами. Для инстансов, категория 1, которую я получаю:
array:10 [
0 => 1
1 => 7
2 => 1
3 => 7
4 => 12
5 => 1
6 => 7
7 => 12
8 => 13
9 => 9
]
Как я могу улучшить метод возврата идентификаторов без дубликатов? Или, может быть, есть лучший способ восстановить эти сообщения?
Вот мои файлы:
Категория модели. php:
class Category extends Model {
public function parent() {
return $this->belongsTo('App\Category', 'parent_id');
}
public function children() {
return $this->hasMany('App\Category', 'parent_id');
}
public function subcategories() {
return $this->children()->with('subcategories');
}
public function parents() {
return $this->parent()->with('parents');
}
public function posts(){
return $this->hasMany('App\Post');
}
}
PostController. php:
public function show($id)
{
$ids =$this->getSubcategoriesIds(Category::with('subcategories')->where('id', $id)->first()));
$posts = Post::whereIn('category_id', $ids)->get();
return view('post.index', compact('posts'));
}
public function getSubcategoriesIds($category) {
$array = [$category->id];
if(count($category->subcategories) == 0) {
return $array;
}
else {
foreach ($category->subcategories as $subcategory) {
array_push($array, $subcategory->id);
if(count($subcategory->subcategories)){
$array = array_merge($array, $this->getChildren($subcategory->subcategories, $array));
}
}
return $array;
}
}
public function getChildren($subcategories, $array) {
foreach ($subcategories as $subcategory) {
array_push($array, $subcategory->id);
if(count($subcategory->subcategories)){
return $array = array_merge($array, $this->getChildren($subcategory->subcategories, $array));
}
return $array;
}
}