php - 使用 kohanna 模型和搜索功能减少 if/else 语句
问题描述
我有一个跨越 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
为空
将其简化为可维护格式的理想方法是什么?
解决方案
毕竟,它可以非常动态地完成。
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();
推荐阅读
- mysql - SQL SUM 每个引用的前 5 行,然后每个引用的所有其他行都被视为 1
- java - API 的问题输出为空。仅来自intelliji
- package - 多个包和符号的包阴影 - 如何使用 cl21
- c# - 有没有办法使用 C# 获得命令行 certreq -accept 的功能?
- java - 如何从Android(Java)中的Firestore读取嵌套对象值及其键
- javascript - 前缀 0 到数字 0-9
- android - 有没有合适的方法来改变加载到膨胀视图的图像视图的图像?
- node.js - 使用 NodeJS Loopback 调用其他 API 后如何查看标头?
- ruby-on-rails - 如何为生产环境运行 docker compose
- arrays - 如何从 if 语句中设置全局数组的大小