Получить все имеющиеся категории с дочерними категориями в иерархической форме

#php #laravel #eloquent

#php #laravel #красноречивый

Вопрос:

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

с помощью приведенного ниже кода я могу получить все эти категории в иерархическом виде, но я не могу сохранить все сообщения для возврата в качестве выходных данных:

 $category = Category::whereId($request->category_id)->whereNull('category_id')->with('childrenCategories')->first();
$this->allCategories($category,$request);

/******************************************/
private function allCategories($category){
    if($category->childrenCategories->first()){
        foreach ($category->childrenCategories as $childCategory) {
            ...
            $this->allCategories($childCategory);
        }
    }
}
 

мои модели:

 class Category extends Model
{
    protected $guarded = ['id'];

    public function parentCategory()
    {
        return $this->belongsTo( Category::class, 'category_id', 'id' );
    }

    public function categories()
    {
        return $this->hasMany(Category::class);
    }

    public function posts()
    {
        return $this->belongsToMany(Post::class);
    }

    public function childrenCategories()
    {
        return $this->hasMany(Category::class)->with('categories');
    }
}


class Post extends Model
{
    use Sluggable, SoftDeletes;

    protected $guarded = ['id'];

    public function categories()
    {
        return $this->belongsToMany(Category::class);
    }
}
 

Комментарии:

1. Вы ищете запрос рекурсивных отношений? github.com/staudenmeir/laravel-adjacency-list отлично подходит для этого. Это поможет вам получить нужное дерево.

2. @MaartenVeerman спасибо, что belongsToMany не поддерживаете

3. Хорошо, в этом случае вам может потребоваться написать свой собственный рекурсивный CTE для обхода иерархии. Но вам также потребуется реализовать свою собственную логику eloquent.