Уменьшите операторы if / else с помощью модели kohanna и функциональности поиска - PullRequest
1 голос
/ 09 января 2020

У меня есть блок if / else, охватывающий более 2000 строк для расширенного поиска, который, я чувствую, может быть серьезно сокращен

Вот небольшой пример больших операторов 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

Поэтому я записал каждую возможную комбинацию

До этого я пытался сделать это более динамичным c и оптимизировать, пытаясь

<?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 будет нулевым

Каков идеальный способ уменьшить это в поддерживаемый формат?

1 Ответ

0 голосов
/ 10 января 2020

В конце концов, это может быть сделано очень динамично.


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