【发布时间】:2020-04-26 11:03:58
【问题描述】:
我有一个跨越 2000 行的 if/else 块,用于高级搜索功能,我认为它可能会被严重削减
这是大型 if/else 语句的一小部分示例
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();
}
}
这里发生的是我正在检查可能发生的所有可能的搜索组合
我们是在搜索word:subject:operator:customer:open 还是在搜索word:subject:operator:customer:closed
所以我写出了每一个可能的组合
在此之前,我曾尝试通过尝试使其更加动态和优化
<?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();
?>
这只会导致$tickets_row 为空
将其简化为可维护格式的理想方法是什么?
【问题讨论】: