May 5, 2021
0
Level 1
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,
)
);
}
}
Please or to participate in this conversation.