в нашем приложении, которое использовало laravel
, мы внедрили родительско-дочернюю структуру с отношениями базы данных. Например:
все идентификаторы являются образцами в этой структуре:
programmings (NULL):
web programmings (1)
backend (2)
laravel (3)
api )4)
lumen (5)
python (6)
desktop (7)
java (8)
каждый родитель в нашей базе данных начинается и указывает на null
, и у каждого дочернего элемента есть родительский идентификатор. теперь, когда мы пытаемся получить всех родителей laravel
, мы должны иметь:
backend - web programmings - programmings
Category
структура модели:
/**
* Get the parent Category to which the current Category belongs.
*/
public function parent(): BelongsTo
{
return $this->belongsTo(Category::class, 'parent_id', 'id', 'parent');
}
/**
* Get all Categories which belong to the current Category.
*/
public function subcategories(): HasMany
{
return $this->hasMany(Category::class, 'parent_id', 'id');
}
я получаю один уровень дочернего родителя, но я не знаю, как я могу получить всех родителей дочернего элемента, пока они не прибыли в null
получение всех сообщений в зависимости от роли:
контроллер:
$categories = auth()->user()->availableCategories();
HasPosts
черта:
trait HasCategories
{
public function availableCategories(): Collection
{
$categories = $this->categories;
$parents = $categories->filter(function ($cat) use ($categories) {
return !in_array($cat->parent_id, $categories->pluck('id')->all()) || is_null($cat->parent_id);
});
$parents->map(
fn ($parent) => $this->setNested($parent, $categories)
);
return $parents;
}
/**
* Get all Categories with Posts associated with the User in nested tree structure.
*/
public function availableCategoriesWithPosts(): Collection
{
$categories = $this->categories()->withPosts()->get();
$parents = $categories->filter(
fn ($cat) =>
!$categories->contains('id', $cat->parent_id) || is_null($cat->parent_id)
);
$parents->map(fn ($parent) => $this->setNested($parent, $categories));
return $parents;
}
protected function setNested($parent, $categories)
{
$parent->setRelation('subcategories', $categories->where('parent_id', $parent->id));
$parent->subcategories->map(function ($sub) use ($categories) {
if ($categories->contains('parent_id', $sub->id)) {
$this->setNested($sub, $categories);
return $sub;
}
});
}
}
я пробую этот код:
public function parent(): BelongsTo
{
return $this->belongsTo(Category::class, 'parent_id', 'id', 'parent')->with('parent');
}