我有这个功能,可以根据提供的搜索条件搜索作业。搜索作业时可以满足五种不同的搜索条件。例如:搜索只能包含公司名称或公司名称,职称,行业等。因此,它们是可以搜索的五种不同组合。我的问题是我不想手动编码搜索的不同组合。我是否可以使用编程模式方法来实现这一目标。这是我目前的代码
$app->post('/search', function () use ($app) {
// reading post params
$company = $app->request()->post('company');
$jobTitle = $app->request()->post('jobTitle');
$parish = $app->request()->post('parish');
$industry = $app->request()->post('industry');
$type = $app->request()->post('type');
$response = array();
$argsArray = array();
$result = '';
if ($company != NULL) {
$argsArray['company'] = $company;
}
if ($jobTitle != NULL) {
$argsArray['jobTitle'] = $jobTitle;
}
if ($parish != NULL) {
$argsArray['parish'] = $parish;
}
if ($industry != NULL) {
$argsArray['industry'] = $industry;
}
if ($type != NULL) {
$argsArray['type'] = $type;
}
$db = new DbHandler();
if (count($argsArray) == 0) {
$result = $db->search();
}
else if (count($argsArray) == 1) {
if (array_key_exists('company', $argsArray)) {
$result = $db->search($company);
}
else if (array_key_exists('jobTitle', $argsArray)) {
$result = $db->search($jobTitle);
}
else if (array_key_exists('parish', $argsArray)) {
$result = $db->search($parish);
}
else if (array_key_exists('industry', $argsArray)) {
$result = $db->search($industry);
}
else if (array_key_exists('type', $argsArray)) {
$result = $db->search($type);
}
} else if (count($argsArray) == 2) {
if (array_key_exists('company', $argsArray) && array_key_exists('jobTitle', $argsArray)) {
$result = $db->search($company, $jobTitle);
}
else if (array_key_exists('parish', $argsArray) && array_key_exists('jobTitle', $argsArray)) {
$result = $db->search($jobTitle, $parish);
}
else if (array_key_exists('company', $argsArray) && array_key_exists('parish', $argsArray)) {
$result = $db->search($parish, $company);
}
else if (array_key_exists('company', $argsArray) && array_key_exists('industry', $argsArray)) {
$result = $db->search($industry, $company);
}
else if (array_key_exists('company', $argsArray) && array_key_exists('type', $argsArray)) {
$result = $db->search($type, $company);
}
else if (array_key_exists('industry', $argsArray) && array_key_exists('type', $argsArray)) {
$result = $db->search($industry, $type);
}
else if (array_key_exists('jobTitle', $argsArray) && array_key_exists('industry', $argsArray)) {
$result = $db->search($jobTitle, $industry);
}
else if (array_key_exists('parish', $argsArray) && array_key_exists('type', $argsArray)) {
$result = $db->search($parish, $type);
}
else if (array_key_exists('industry', $argsArray) && array_key_exists('parish', $argsArray)) {
$result = $db->search($industry, $parish);
}
else if (array_key_exists('type', $argsArray) && array_key_exists('jobTitle', $argsArray)) {
$result = $db->search($type, $jobTitle);
}
} else if (count($argsArray) == 3) {
} else if (count($argsArray) == 4) {
} else if (count($argsArray) == 5) {
$result = $db->search($type, $jobTitle, $parish, $industry, $company);
}
如你所知,如果我要为五种不同的组合做这件事,那将会很麻烦而且效率不高。我怎么能解决这个问题。
答案 0 :(得分:0)
如果顺序无关紧要,您可以尝试装饰器模式,即搜索与其他搜索只是逻辑“和”。使用模式它有点清洁,但它取决于数据。
答案 1 :(得分:0)
这就是我使用可变长度参数列表解决问题的方法。
public function search(...$args)
{
//only searches for jobs that are open
$status = "open";
$wild_card = "%";
//Loops through the array of search variables
foreach ($args as $a) {
//checks if no search criteria was set if not it searches for all available jobs
if (count($a) == 0) {
return $this->noCriteria($status);
} //searches when one search criteria was set
else if (count($a) == 1) {
return $this->oneCriteria($status, $wild_card, $a);
} // searches jobs with two criteria set
else if (count($a) == 2) {
return $this->twoCriteria($status, $wild_card, $a);
} // searches jobs with THREE criteria set
else if (count($a) == 3) {
return $this->threeCriteria($status, $wild_card, $a);
} // searches jobs with four criteria set
else if (count($a) == 4) {
return $this->fourCriteria($status, $wild_card, $a);
} // searches jobs with five criteria set
else if (count($a) == 5) {
return $this->allCriteria($status, $wild_card, $a);
}
}
return NULL;
}