$products = Product::available()->orderBy($sort_filed, $sort_type);; foreach($filter as $attribute => $options) { $products->join('product_attributes as pa' . $attribute, function ($join) use ($attribute) { $join->on('pa' . $attribute . '.product_id', '=', 'products.id'); }); $i = 0; foreach($options as $option) { //$products->where(function ($products) use ($attribute, $option, $i) { if ($i == 0) { $products->where(function ($query) use ($attribute, $option) { $query->where('pa' . $attribute . '.attribute_id', '=', $attribute); $query->where('pa' . $attribute . '.attribute_option_id23', '=', $option); }); $i++; } else { $products->orWhere(function ($query) use ($attribute, $option) { $query->where('pa' . $attribute . '.attribute_id', '=', $attribute); $query->where('pa' . $attribute . '.attribute_option_id2', '=', $option); }); }; //}); }; };