Я пытаюсь получить товары из категории и всех ее подкатегорий.
Вот моя таблица categories
:
| id | parent_id | name |
|---- |----------- |------------- |
| 1 | NULL | Electronics |
| 2 | 1 | Computers |
| 3 | 2 | Accessories |
| 4 | 3 | Keyboards |
, а вот таблица моих продуктов:
| id | category_id | name |
|---- |------------- |----------- |
| 1 | 2 | Product 1 |
| 2 | 3 | Product 2 |
| 3 | 4 | Product 3 |
Допустим, я нахожусь на странице категории Computers
, и я хочу отобразить товары из этой таблицы и все ее дочерние элементы.
, поэтому он должен сначала получить товары из Computers
и Accessories
а также Keyboards
.
Вот моя Категория Модель:
public function parent() {
return $this->belongsTo(Category::class, 'parent_id');
}
public function childs() {
return $this->hasMany(Category::class, 'parent_id');
}
public function products() {
return $this->hasManyThrough(Product::class, Category::class, 'parent_id', 'category_id', 'id');
}
Продукт Модель:
public function categories() {
return $this->belongsTo(Category::class, 'category_id');
}
Запрос :
Category::with(['products', 'childs.products'])->where('id', $category->id)->get();
Возврат :
{
"id":11,
"parent_id":4,
"name":"Computers",
"products":[
{
"id":2,
"category_id":12,
"title":"Product 1",
"laravel_through_key":11
}
],
"childs":[
{
"id":12,
"parent_id":11,
"name":"Accessories",
"products":[
{
"id":1,
"category_id":13,
"user_id":1,
"title":"Product 2",
"laravel_through_key":12
}
]
}
]
}
Выше, он выходит из последней дочерней категории Keyboards
.
Я пытался использовать отношения hasManyThrough
, но я получил продукты только от Computers
и Accessories
, но не достиг Keyboards
.
Так что, если я нахожусь на Категория Я хочу получить все продукты из этого дерева категорий. даже если у подкатегории есть подкатегории.
Как мне этого добиться?
Спасибо.
Обновление :
Я применил фрагмент в ответе Foued MOUSSI :
public function childrenRecursive() {
return $this->childs()->with('childrenRecursive');
}
$categoryIds = Category::with('childrenRecursive')->where('id', $category->id)->get();
Return :
[
{
"id":2,
"parent_id":1,
"name":"Computers",
"children_recursive":[
{
"id":3,
"parent_id":2,
"name":"Accessories",
"children_recursive":[
{
"id":4,
"parent_id":3,
"name":"Keyboards",
"children_recursive":[]
}
]
}
]
}
]
и я получил массив категория и все ее подкатегории, но чтобы получить продукты из всех этих категорий, мне нужно извлечь идентификаторы из списка с помощью childrenRecursive
, чтобы вызвать что-то вроде:
Product::whereIn('category_id', $categoryIds)->get();
Есть идеи?