Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

nitinjohnson's avatar

How to query for category attributes on Laravel?

I am working on a classified site in laravel. I have a list of categories and for each category there are specific attributes. I have seeded the database with data. I am working on the filters of category page. For example for a commercial building i want to filter by no. of bedrooms, no. of bathrooms, is furnished etc. When I try to filter with only single value I am getting results, but with multiple values no records are returned even though values with both the fields exists for an ad. Please check attached image for filter idea.

Controller Code

public function index($slug, Request $request){ 
	$page_title='Test';  
	$content=null;
	$category=Category::where('category_slug',$slug)->first();  
	$ad_details=AD::where('ad_slug',$slug)->first();              

	if(!empty($category)){
		$query_vars=$this->array_filter_recursive($request->all());            
		$attribute_name_keys=array_keys($query_vars);            

		$emirate=$request->get('emirate');
		$emirate_details=Emirate::where('emirate',$emirate)->first();
		$emirate_id=null;
		if(!empty($emirate_details)){
			$emirate_id=$emirate_details->id;
		}

		$text_attribute_ids=array();
		$text_attribute_values=array();
		$text_attribute_text=array();

		$dropdown_attribute_ids=array();
		$dropdown_attribute_values=array();
		$dropdown_attribute_text=array();

		$number_attribute_ids=array();
		$number_attribute_values=array();
		$number_attribute_text=array();
		
		if(!empty($query_vars)){
			foreach($attribute_name_keys as $ank){
				if(is_array($query_vars[$ank])){
					for($i=0;$i<sizeof($query_vars[$ank]);$i++){
						$attribute_details=Attribute::where('attribute_slug',$ank)->first();                            
						if(!empty($attribute_details)){
							if($attribute_details->field_type=='text' || $attribute_details->field_type=='textarea'){
								$text_attribute_values[]=$query_vars[$ank][$i];
								if(!empty($attribute_details)){
									$text_attribute_ids[]=$attribute_details->id;
								}
								$text_attribute_text[]=$attribute_details->id.'_'.$query_vars[$ank][$i];
							} else if($attribute_details->field_type=='number'){
								$number_attribute_values[]=$query_vars[$ank][$i];
								if(!empty($attribute_details)){
									$number_attribute_ids[]=$attribute_details->id;
								}
								$number_attribute_text[]=$attribute_details->id.'_'.$query_vars[$ank][$i];
							} else if($attribute_details->field_type=='dropdown'){
								$dropdown_attribute_text[]=$query_vars[$ank][$i];
								//$dropdown_attribute_values[]=array(array('attribute_id',$attribute_details->id) , array('attribute_value' , $query_vars[$ank][$i])); 
								$dropdown_attribute_values[]=$query_vars[$ank][$i]; 
								if(!empty($attribute_details)){
									$dropdown_attribute_ids[]=$attribute_details->id;
								}
								$dropdown_attribute_text[]=$attribute_details->id.'_'.$query_vars[$ank][$i];
							}
						}                                                                                  
					}
				} else {                       
					$attribute_details=Attribute::where('attribute_slug',$ank)->first();  
					if(!empty($attribute_details)){
						if($attribute_details->field_type=='text' || $attribute_details->field_type=='textarea'){
							$text_attribute_values[]=$query_vars[$ank];
							if(!empty($attribute_details)){
								$text_attribute_ids[]=$attribute_details->id;
							}
							$text_attribute_text[]=$attribute_details->id.'_'.$query_vars[$ank];
						} else if($attribute_details->field_type=='number'){
							$number_attribute_values[]=$query_vars[$ank];
							if(!empty($attribute_details)){
								$number_attribute_ids[]=$attribute_details->id;
							}
							$number_attribute_text[]=$attribute_details->id.'_'.$query_vars[$ank];
						} else if($attribute_details->field_type=='dropdown'){
							$dropdown_attribute_text[]=$query_vars[$ank];                                
							//$dropdown_attribute_values[]=array(array('attribute_id',$attribute_details->id) , array('attribute_value' , $query_vars[$ank])); 
							$dropdown_attribute_values[]=$query_vars[$ank]; 
							if(!empty($attribute_details)){
								$dropdown_attribute_ids[]=$attribute_details->id;
							}
							$dropdown_attribute_text[]=$attribute_details->id.'_'.$query_vars[$ank];
						}
					}                         
				}
			}
		}

		$text_attribute_ids=array_unique($text_attribute_ids);
		$dropdown_attribute_ids=array_unique($dropdown_attribute_ids);
		$number_attribute_ids=array_unique($number_attribute_ids);

		$final_attribute_ids=array_merge($text_attribute_ids,$dropdown_attribute_ids,$number_attribute_ids);
		$final_attribute_ids=array_unique($final_attribute_ids);

		$final_attribute_values=array_merge($text_attribute_values,$dropdown_attribute_values,$number_attribute_values);

		//dd($final_attribute_ids,$final_attribute_values);

		//DB::enableQueryLog();
		$content_details=DB::table('ads')
		->join('ad_attributes','ads.id','=','ad_attributes.ad_id')
		->select('ads.*')
		->where('ads.category_id',$category->id)
		->when($emirate_id, function ($query, $emirate_id) {
			return $query->where('ads.emirate_id', $emirate_id);                       
		})
		->when($final_attribute_ids, function ($query, $final_attribute_ids) {
			$query->whereIn('ad_attributes.attribute_id', $final_attribute_ids);           
		})
		->when($text_attribute_values, function ($query, $text_attribute_values) {
			foreach($text_attribute_values as $tav){
				$query->where('ad_attributes.attribute_value', 'like','%'.$tav.'%'); 
			}                          
		})
		->when($dropdown_attribute_values, function ($query, $dropdown_attribute_values) {
			foreach($dropdown_attribute_values as $dav){
				$query->where('ad_attributes.attribute_value', $dav); 
			}                          
		})
		->when($number_attribute_values, function ($query, $number_attribute_values) {
			foreach($number_attribute_values as $nav){
				$query->whereBetween('ad_attributes.attribute_value', [0,$nav]); 
			}                          
		})
		->groupBy('ads.id')
		->get();
		//$query = DB::getQueryLog();
		//$query = end($query);
		//dd($query);         

		$ads_count=$content_details->count();
		
		//DB::enableQueryLog();
		$content=DB::table('ads')
		->join('ad_attributes','ads.id','=','ad_attributes.ad_id')
		->select('ads.*')
		->where('ads.category_id',$category->id)
		->when($emirate_id, function ($query, $emirate_id) {
			return $query->where('ads.emirate_id', $emirate_id);                       
		})
		->when($text_attribute_values, function ($query, $text_attribute_values) {
			foreach($text_attribute_values as $tav){
				$query->where('ad_attributes.attribute_value', 'like','%'.$tav.'%'); 
			}                          
		})
		->when($dropdown_attribute_values, function ($query, $dropdown_attribute_values) {
			foreach($dropdown_attribute_values as $dav){
				$query->where('ad_attributes.attribute_value', $dav); 
			}                          
		})
		->when($number_attribute_values, function ($query, $number_attribute_values) {
			foreach($number_attribute_values as $nav){
				$query->whereBetween('ad_attributes.attribute_value', [0,$nav]); 
			}                          
		})
		->groupBy('ads.id')
		->paginate(12);
		//$query = DB::getQueryLog();
		//$query = end($query);
		//dd($query);            
		
		$recent_ads=Ad::where('category_id',$category->id)->orderBy('id','DESC')->limit(3)->get();
		$filters=DB::table('attributes')
		->leftJoin('attribute_options','attributes.id','=','attribute_options.attribute_id')
		->select('attributes.*','attribute_options.option_value','attributes.id as main_attribute_id')
		->where('attributes.category_id',$category->id)
		->where('attributes.use_as_filter','Yes')
		->orderBy('attributes.sort_order','ASC')
		->groupBy('attributes.id')
		->get();

		if(empty($filters)){
			$filters=array();
		}

		$top_sub_category_list = Category::where('parent_id', $category->id)->limit(7)->get();  
		if(empty($top_sub_category_list)){
			$top_sub_category_list=array();
		}          

		$category_box=$this->GetSubCategoryContentEdit($category->id,$category->parent_id);
		$current_category_name = $category->category_name;

		$emirates = Emirate::orderBy('emirate', 'ASC')->get();

		return view("frontend.category.category")->with(
			array(
				'slug'=>$slug,
				'content'=>$content,
				'ads_count'=>$ads_count,
				'recent_ads'=>$recent_ads,
				'recent_ads'=>$recent_ads,
				'category_box'=>$category_box,
				'filters'=>$filters,
				'top_sub_category_list'=>$top_sub_category_list,
				'current_category_name'=>$current_category_name,
				'emirates'=>$emirates,
				'emirate_id'=>$emirate_id,
				'dropdown_attribute_text'=>$dropdown_attribute_text,
				'text_attribute_values'=>$text_attribute_values,
				'text_attribute_text'=>$text_attribute_text,
				'number_attribute_ids'=>$number_attribute_ids,
				'number_attribute_values'=>$number_attribute_values,
				'number_attribute_text'=>$number_attribute_text,
			)
		);
	}
}
0 likes
0 replies

Please or to participate in this conversation.