0

次のクエリビルダーがあります。一部のケースには、同じコード片があります (パラメーターを持つもの)。

私は、コードを複製するのは良くないことを知っています。

このループを改善するにはどうすればよいでしょうか? ありがとう !

for ($i = 0; $i < $len; ++$i) {
    switch ($conditions[$i]['condition']) {
        case 'version':
            $value_counter++;
            $sql .= ' AND `musers`.`app_version` = :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'except_version':
            $value_counter++;
            $sql .= ' AND `musers`.`app_version` != :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'from_credits':
            $value_counter++;
            $sql .= ' AND `musers`.`credits` >= :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'to_credits':
            $value_counter++;
            $sql .= ' AND `musers`.`credits` <= :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'no_credits':
            $sql .= ' AND `musers`.`credits` = 0';
            break;
        case 'register_atleast':
            $value_counter++;
            $sql .= ' AND DATEDIFF(NOW(), `musers`.`creation_date`) > :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'talked_atleast':
            $value_counter++;
            $sql .= " AND `musers`.`total_talktime` >= :value".$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'never_talked':
            $sql .= " AND `musers`.`total_talktime` = 0";
            break;
        case 'purchase_atleast':
            $value_counter++;
            $sql .= " AND `musers`.`purchase_times` >= :value".$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'never_purchase':
            $sql .= ' AND `musers`.`purchase_times` = 0';
            break;
        case 'from_birthdate':
            $value_counter++;
            $sql .= " AND (`musers`.`birthdate` = '0000-00-00' OR `musers`.`birthdate` >= :value".$value_counter." )";
            $values[$value_counter] = date('Y-m-d', strtotime($conditions[$i]['value']));
            break;
        case 'to_birthdate':
            $value_counter++;
            $sql .= " AND (`musers`.`birthdate` = '0000-00-00' OR `musers`.`birthdate` <= :value".$value_counter." )";
            $values[$value_counter] = date('Y-m-d', strtotime($conditions[$i]['value']));
            break;
        case 'from_creation_date':
            $value_counter++;
            $sql .= " AND (`musers`.`creation_date` = '0000-00-00' OR `musers`.`creation_date` >= :value".$value_counter." )";
            $values[$value_counter] = date('Y-m-d', strtotime($conditions[$i]['value']));
            break;
        case 'to_creation_date':
            $value_counter++;
            $sql .= " AND (`musers`.`creation_date` = '0000-00-00' OR `musers`.`creation_date` <= :value".$value_counter." )";
            $values[$value_counter] = date('Y-m-d', strtotime($conditions[$i]['value']));
            break;
        case 'user_id':
            $value_counter++;
            $sql .= ' AND `musers`.`id` = :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'visit_app_aleast':
            $value_counter++;
            $sql .= ' AND `musers`.`visit_app_times` >= :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'visit_app_less':
            $value_counter++;
            $sql .= ' AND `musers`.`visit_app_times` < :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'total_calls_atleast':
            $value_counter++;
            $sql .= ' AND `musers`.`total_calls` >= :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'total_calls_less':
            $value_counter++;
            $sql .= ' AND `musers`.`total_calls` < :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
        case 'hourdiff':
            $value_counter++;
            $sql .= ' AND `hourdiff` = :value'.$value_counter;
            $values[$value_counter] = $conditions[$i]['value'];
            break;
    }
}
4

1 に答える 1

-1

一般に、コードの重複を避けたい場合は、関数化されたメソッドまたはオブジェクト メソッドで重複したコードを抽出します。3 行のコードであっても、それが繰り返される場合は、関数を作成して、これらの 3 行のコードが必要な場所で呼び出す価値があります。

特定のケースでは、別の方法があります。ケースをスイッチ構造に積み重ねます。

switch($conditions[$i]['condition']) {
    case 'version':
    case 'except_version':
    case 'from_credits':
        $value_counter++;
        $sql .= ' AND `musers`.`app_version` = :value'.$value_counter;
        $values[$value_counter] = $conditions[$i]['value'];
        break;
     case 'no_credits':
        $sql .= ' AND `musers`.`credits` = 0';
        break;
     // etc.
}

詳細については、「スイッチ」のドキュメントを参照してください:)

于 2013-10-03T12:17:13.120 に答える