如何查询不完整的输入

时间:2017-06-11 01:45:04

标签: php ajax laravel

我想将待处理,发货或取消等查询字符串转换为号码状态。

$q = strtolower($keyword);

if($q == 'pen' or $q == 'pend' or $q == 'pending' ) {
    $d = 1;
} elseif($q == 'shi' or $q == 'ship' or $q == 'shipped') {
    $d = 2;
} elseif($q == 'can' or $q == 'cancel' ) {
    $d = 3;
} else {
    $d = 4;
}

$query->whereStatus($d);

当前查询工作正常,但or太多了。可以缩短方式吗?

3 个答案:

答案 0 :(得分:2)

str_is(query, stringToSearch)可能就足够了:

if (str_is('pen*', $q)) {
    $d = 1;
}

否则你可以从数组中解析它们:

$pendingArray = ['pen', 'pend', 'pending'];
if (in_array($q, $pendingArray)) {
    $d = 1;
}

答案 1 :(得分:1)

如果这些都是您需要的所有条件,您可以随时使用switch

$q = strtolower($keyword);

$d = 4;

switch($q) {
    case 'pen':
    case 'pend':
    case 'pending':
    case 'pen':
        $d = 1;
        break;
    case 'shi':
    case 'ship':
    case 'shipped':
        $d = 2;
        break;
    case 'can':
    case 'cancel':
        $d = 3;
        break;
}

$query->whereStatus($d);

如果需要在模型上调用它,可以将它保存到Laravel scope函数中,如下所示:

Laravel模型

public function scopeSearchStatus($query, $keyword) {
    /** All the code above **/
}

然后可以在任何地方干净地调用它:

SomeModel::searchStatus($keyword);

答案 2 :(得分:1)

你也可以试试这个:

<?php
$q = strtolower($keyword);

$d = (preg_match('/\b(pen|pend|pending)\b/', $q)) ? 1 : 4;
$d = (preg_match('/\b(shi|ship|shipped)\b/', $q)) ? 2 : 4;
$d = (preg_match('/\b(can|cancel|)\b/', $q)) ? 3 : 4;

$query->whereStatus($d);