Search code examples
phpkohana

Reduce if/else statements with kohanna model and search functionality


I have an if/else block spanning over 2000 lines for an advanced search which I feel could be severely cut down.

Here is a small sample of the large if/else statements:

if($isSearch){
            //Is search
            if($isWordSearch){
                //Is word search
                if($isSubjectSearch){
                    //Is subject search
                    if($isDepartmentSearch){
                        //Is department Search
                        if($isOperatorSearch){
                            //Is operator search
                            if($isCustomerSearch){
                                //Is customer search
                                if($search_status == "Open"){
                                    //Is word,subject,department,operator,customer,open
                                    $tickets_row = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->and_where("user_id","=",$search_customer)
                                        ->and_where("status_id","NOT IN",array("50","60"))
                                        ->limit($items_per_page)
                                        ->offset($offset)
                                        ->order_by("status_id","asc")
                                        ->order_by("update_date","asc")
                                        ->find_all();
                                    
                                    $tickets_row_count = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->and_where("user_id","=",$search_customer)
                                        ->and_where("status_id","NOT IN",array("50","60"))
                                        ->count_all();
                                }elseif($search_status == "Closed"){
                                    //Is word,subject,department,operator,customer,closed
                                    $tickets_row = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->and_where("user_id","=",$search_customer)
                                        ->and_where("status_id","IN",array("50","60"))
                                        ->limit($items_per_page)
                                        ->offset($offset)
                                        ->order_by("status_id","asc")
                                        ->order_by("update_date","asc")
                                        ->find_all();
                                    
                                    $tickets_row_count = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->and_where("user_id","=",$search_customer)
                                        ->and_where("status_id","IN",array("50","60"))
                                        ->count_all();
                                }else{
                                    //Is word,subject,department,operator,customer,all
                                    $tickets_row = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->and_where("user_id","=",$search_customer)
                                        ->limit($items_per_page)
                                        ->offset($offset)
                                        ->order_by("status_id","asc")
                                        ->order_by("update_date","asc")
                                        ->find_all();
                                    
                                    $tickets_row_count = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->and_where("user_id","=",$search_customer)
                                        ->count_all();
                                }
                            }else{
                                //Is not customer search
                                if($search_status == "Open"){
                                    //Is word,subject,department,operator,open
                                    $tickets_row = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->and_where("status_id","NOT IN",array("50","60"))
                                        ->limit($items_per_page)
                                        ->offset($offset)
                                        ->order_by("status_id","asc")
                                        ->order_by("update_date","asc")
                                        ->find_all();
                                    
                                    $tickets_row_count = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->and_where("status_id","NOT IN",array("50","60"))
                                        ->count_all();
                                }elseif($search_status == "Closed"){
                                    //Is word,subject,department,operator,closed
                                    $tickets_row = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->and_where("status_id","IN",array("50","60"))
                                        ->limit($items_per_page)
                                        ->offset($offset)
                                        ->order_by("status_id","asc")
                                        ->order_by("update_date","asc")
                                        ->find_all();
                                    
                                    $tickets_row_count = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->and_where("status_id","IN",array("50","60"))
                                        ->count_all();
                                }else{
                                    //Is word,subject,department,operator,all
                                    $tickets_row = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->limit($items_per_page)
                                        ->offset($offset)
                                        ->order_by("status_id","asc")
                                        ->order_by("update_date","asc")
                                        ->find_all();
                                    
                                    $tickets_row_count = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("operator_id","=",$search_operator)
                                        ->count_all();
                                }
                            }
                        }else{
                            //Is not operator search
                            if($isCustomerSearch){
                                //Is customer search
                                if($search_status == "Open"){
                                    //Is word,subject,department,customer,open
                                    $tickets_row = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("user_id","=",$search_customer)
                                        ->and_where("status_id","NOT IN",array("50","60"))
                                        ->limit($items_per_page)
                                        ->offset($offset)
                                        ->order_by("status_id","asc")
                                        ->order_by("update_date","asc")
                                        ->find_all();
                                    
                                    $tickets_row_count = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("user_id","=",$search_customer)
                                        ->and_where("status_id","NOT IN",array("50","60"))
                                        ->count_all();
                                }elseif($search_status == "Closed"){
                                    //Is word,subject,department,customer,closed
                                    $tickets_row = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("user_id","=",$search_customer)
                                        ->and_where("status_id","IN",array("50","60"))
                                        ->limit($items_per_page)
                                        ->offset($offset)
                                        ->order_by("status_id","asc")
                                        ->order_by("update_date","asc")
                                        ->find_all();
                                    
                                    $tickets_row_count = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("user_id","=",$search_customer)
                                        ->and_where("status_id","IN",array("50","60"))
                                        ->count_all();
                                }else{
                                    //Is word,subject,department,customer,all
                                    $tickets_row = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("user_id","=",$search_customer)
                                        ->limit($items_per_page)
                                        ->offset($offset)
                                        ->order_by("status_id","asc")
                                        ->order_by("update_date","asc")
                                        ->find_all();
                                
                                    $tickets_row_count = $support_tickets_model
                                        ->where("subject","LIKE","%$search_text%")
                                        ->and_where("___dep_id","=",$search_department)
                                        ->and_where("user_id","=",$search_customer)
                                        ->count_all();
                                }
                            }

What is happening here is I am checking for every possible combination of searches that could occur.

Are we searching for a word:subject:operator:customer:open or are we searching for a word:subject:operator:customer:closed?

So I wrote out every single possible combination.

Before this I had tried to make this more dynamic and optimized by trying:

<?php
  $tickets_row = $support_tickets_model;
        
    if(true){
    $tickets_row->where("subject","LIKE","%$search_text%");
  }
  
  $tickets_row
    ->limit($items_per_page)
        ->offset($offset)
        ->order_by("status_id","asc")
        ->order_by("update_date","asc")
        ->find_all();
?>

This just results in $tickets_row being null.

What is the ideal way to reduce this into a maintainable format?


Solution

  • After all, it can be done extremely dynamically.

    
    if($search_text) {
      $support_tickets_model->where("subject","LIKE","%$search_text%");
    }
    if($search_status == "Closed")
      $support_tickets_model->where("status_id","IN",array("50","60"));
    else if($search_status == "Open")
      $support_tickets_model->where("status_id","NOT IN",array("50","60"));
    
    
    if($search_department)
      $support_tickets_model->where("___dep_id","=",$search_department);
    if($search_operator)
      $support_tickets_model->where("operator_id","=",$search_operator);
    if($search_customer)
      $support_tickets_model->where("user_id","=",$search_customer);
    //... another 
    
    //I'm not sure if you should clone the $support_tickets_model here before using `count_all()`
    $tickets_row_count = $support_tickets_model->count_all();
    
    $tickets_row = $support_tickets_model->limit($items_per_page)   
                                                ->offset($offset)   
                                                ->order_by("status_id","asc")   
                                                ->order_by("update_date","asc") 
                                                ->find_all();