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?
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();