I have to create API for dynamic menu used in react js. The menu contains catgeory, subcategory and further subcategory. I have created the code, but it is not working as expected.
The required output is,
JavaScript
x
{
"data": [
{
"id": 15,
"name": "category 1",
"slug": "category-1",
"subcategory": [
{
"sub_id": 15,
"sub_name": "subcategory 1",
"sub_slug": "subcategory-1"
"fsubcategory": [
{
"fsub_id": 15,
"fsub_name": "fsubcategory 1",
"fsub_slug": "fsubcategory-1"
},
]
},
]
},
.
]
}
The code I have used to create the above result is,
JavaScript
$list = Category::select('id', 'name', 'slug')->where(array('in_menu' => 1, 'status' => 1, 'deleted_at' => null))->orderBy('id', 'desc')->get();
$data = [];
foreach ($list as $category) {
$sublist = Subcategory::select('id', 'name', 'slug')->where(array('category_id' => $category->id, 'status' => 1, 'deleted_at' => null))->orderBy('id', 'desc')->get();
$item = [
"id" => $category->id,
"name" => $category->name,
"slug" => $category->slug,
"subcategory" => [],
];
foreach($sublist as $subcategory) {
$fsublist = Fsubcategory::select('id', 'name', 'slug')->where(array('category_id' => $category->id, 'subcategory_id' => $subcategory->id, 'status' => 1, 'deleted_at' => null))->orderBy('id', 'desc')->get();
$item["subcategory"][] = [
"sub_id" => $subcategory->id,
"sub_name" => $subcategory->name,
"sub_slug" => $subcategory->slug,
"fsubcategory" => [],
];
foreach($fsublist as $fsubcategory) {
$item["subcategory"][]["fsubcategory"] = [
"fsub_id" => $fsubcategory->id,
"fsub_name" => $fsubcategory->name,
"fsub_slug" => $fsubcategory->slug,
];
}
}
$data[] = $item;
}
return response()->json(['data' => $data]);
But the above code is not getting the required output. The output for the above code is,
JavaScript
{
"data": [
{
"id": 11,
"name": "dhdf dfheryer",
"slug": "dhdf-dfheryer",
"subcategory": [
]
},
{
"id": 10,
"name": "dfhdfdf hery1----",
"slug": "fhdfdf-hery1",
"subcategory": [
{
"sub_id": 5,
"sub_name": "sdgwet gjsdg",
"sub_slug": "sdgwet-gjsdg",
"fsubcategory": [
]
}
]
},
{
"id": 1,
"name": "dfhdfh",
"slug": "dfhdf",
"subcategory": [
{
"sub_id": 7,
"sub_name": "FSubcategory 1",
"sub_slug": "fsubcategory-1",
"fsubcategory": [
]
},
{
"sub_id": 2,
"sub_name": "Test Subcategory",
"sub_slug": "test-subcategory",
"fsubcategory": [
]
},
[
{
"fsubcategory": {
"fsub_id": 2,
"fsub_name": "dfhdf dfhdfh",
"fsub_slug": "dfhdf-dfhdfh"
}
}
],
{
"sub_id": 1,
"sub_name": "ssdgsdg",
"sub_slug": "sgsdg",
"fsubcategory": [
]
},
[
{
"fsubcategory": {
"fsub_id": 3,
"fsub_name": "dfdfh",
"fsub_slug": "dfdfh"
}
}
],
[
{
"fsubcategory": {
"fsub_id": 1,
"fsub_name": "fdfd",
"fsub_slug": "fdfd"
}
}
]
]
}
]
}
fsubcategory
is outside subcategory
. How to get the required output. How to modify the code to achieve the correct result. I am really stuck here.
Advertisement
Answer
I have got the answer,
JavaScript
$list = Category::select('id', 'name', 'slug')
->where([
'in_menu' => 1,
'status' => 1,
'deleted_at' => null
])
->orderBy('id', 'desc')
->get();
$data = [];
foreach ($list as $category) {
$sublist = Subcategory::select('id', 'name', 'slug')
->where([
'category_id' => $category->id,
'status' => 1,
'deleted_at' => null
])
->orderBy('id', 'desc')
->get();
$item = [
"id" => $category->id,
"name" => $category->name,
"slug" => $category->slug,
"subcategory" => [],
];
foreach ($sublist as $subcategory) {
$fsublist = Fsubcategory::select('id', 'name', 'slug')->where(array('subcategory_id' => $subcategory->id, 'status' => 1, 'deleted_at' => null))->orderBy('id', 'desc')->get();
$subitems = [];
foreach ($fsublist as $fsubcategory) {
$subitems[] = [
"fsub_id" => $fsubcategory->id,
"fsub_name" => $fsubcategory->name,
"fsub_slug" => $fsubcategory->slug,
];
}
$item["subcategory"][] = [
"sub_id" => $subcategory->id,
"sub_name" => $subcategory->name,
"sub_slug" => $subcategory->slug,
"fsubcategory" => $subitems,
];
}
$data[] = $item;
}
return response()->json(['response' => 200, 'data' => $data]);
This will provide the required output