My aim is to not display the category which don’t have any products as of now.
I have a drop-down list having all the category (level down to sub-category as well)
which giving me the following results.
JavaScript
x
Electronics
- media
- speaker
- DVDs
- Computers
Clothing
- Mens
- Shirt
- Jeans
- Women
Craft
But, I want to achieve following results
JavaScript
Electronics
- media
- speaker
- Computers
Clothing
- Mens
- Shirt
The database tables are following
JavaScript
categories
id | name | parent_id
-----------------------------
1 | Electronics| null
2 | media | 1
3 | Clothing | null
4 | Craft | null
5 | Mens | 3
6 | Women | 3
7 | Shirt | 5
8 | Jeans | 5
9 | speaker | 2
10 | DVDs | 2
11 | Computers | 1
products
id | p_name | p_cat_id
---------------------------------------
1 | Cotten shirt for men | 7
2 | New Jeans bla bal | 7
3 | Custome gaming pc 1 | 11
4 | Custome gaming pc 2 | 11
5 | Bluetooth speaker | 9
Category model
JavaScript
public function subCategory(){
return $this->hasMany(Category::class, 'parent_id');
}
public function products(){
return $this->hasMany(Product::class,'p_cat_id','id')->where('status','=', 1);;
}
I have tried following to get category list. which gives me all the categories and sub categories
JavaScript
function getCategory() {
return Category::where([['parent_id', '=', null], ['status', '=', 1]])->orderBy("name", "ASC")->get();
}
Advertisement
Answer
If you need to filter out that only showing category which has least one product:
JavaScript
$categories = Category::with('products')->has('products')->get();
It is a simple function ->has()
will check category has any products.
JavaScript
function getCategory() {
$categories = Category::with('products')->has('products')->get();
return $categories;
}
UPDATE:
To make it work for sub-categories, I have fixed it for myself as following
in Helper:
JavaScript
function getSubcategory($catid) {
return Category::where([['parent_id', '=', $catid], ['status', '=', 1]])
->with('products')->has('products')->get();
}
In, Blade file:
JavaScript
@if(count( getSubcategory( $category->id )) > 0)
@include('category.subCategoryList',['subcategories' => getSubcategory( $category->id )])
@endif
Hope it will working for others too.