Eloquent: filter only rows which has related “children” rows

Simple use-case: you want to filter only those categories which have at least one product. Or course, you write Category::with(‘products’)->… but how do you filter out those empty categories? Those with no product? There’s an app function for that: has().

Let’s show the full code.


class Category extends Model {

	// ...

	public function products() {
		return $this->hasMany('App\Product');

	// ...



function getIndex() {
	$categories = Category::with('products')->has('products')->get();
	return view('categories.index', compact('categories'));

So, as you can see, it’s a simple filter-function ->has(‘products’) – it will filter out the categories without products.

Like our articles?
Check out our Laravel online courses!


    • Well, I want to take categories WITH products to view how many products are there in category, like Clothing (53), Books (100) etc. But agree that I didn’t put that detail into the article, well spotted Marius.

  1. How about if you filter ‘product’, and the product return an empty result ?

    I dont want to display the category if the product return an empty result ? using ->has got still no effect for me …



Please enter your comment!
Please enter your name here