多个搜索条件的设计模式

时间:2014-12-22 21:23:35

标签: php design-patterns methodology

我有这个功能,可以根据提供的搜索条件搜索作业。搜索作业时可以满足五种不同的搜索条件。例如:搜索只能包含公司名称或公司名称,职称,行业等。因此,它们是可以搜索的五种不同组合。我的问题是我不想手动编码搜索的不同组合。我是否可以使用编程模式方法来实现这一目标。这是我目前的代码

  $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);
}

如你所知,如果我要为五种不同的组合做这件事,那将会很麻烦而且效率不高。我怎么能解决这个问题。

2 个答案:

答案 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;
}