如何最大程度地减少SQL查询中的代码重复?

时间:2018-10-26 03:02:09

标签: php sql

我正在研究要避免sql查询重复的SQL查询代码。

下面是sql查询代码:

    switch ($y) {
        case 'l.text':
            $query->order('numeric_text ' . (strtolower($x) == 'DESC' ? 'DESC' : 'ASC') .
                ', ' . $y . ' ' . (strtolower($x) == 'DESC' ? 'DESC' : 'ASC'));
            break;
    }

在上面的SQL查询代码strtolower($x) == 'DESC' ? 'DESC' : 'ASC'中有两个地方使用。我正在考虑在上面放一个杂物。

这是我尝试过的:

    $sortOrder = (strtolower($x) == 'DESC' ? 'DESC' : 'ASC');

    switch ($y) {
        case 'l.text':
            $query->order('numeric_text ' . $sortOrder . ', ' . $y . ' ' . $sortOrder);
            break;
    }



问题陈述:

我想知道是否还有其他更好的方法,我们可以避免sql查询重复。

4 个答案:

答案 0 :(得分:0)

也许您可以在模型或帮助程序库中使用函数来为您完成这项工作,并在您的项目中使用它,那么干掉代码是个好主意。

// Helper

function sort_statment($fields, $sort_order) {
  $sort_statment = '';
  foreach($fields as $field){
     $sort_statment += $field . ' ' . $sort_order 
  }
  return $sort_statment;
}


// Model 
$sort_fields ['numeric_text', 'other_field', $y ....];

switch ($y) {
    case 'l.text':
        $query->order(sort_statment($sort_fields, $sort_order);
        break;
}

答案 1 :(得分:0)

就像尼克在评论中提到的那样,您不能降低字符串并使它等于'DESC'或'ASC',假设它只是一个错字,您可以覆盖变量而不是声明一个新变量:

    if(strtoupper($x) != 'DESC') $x = 'ASC';

switch ($y) {
    case 'l.text':
        $query->order('numeric_text ' . strtoupper($x) . ', ' . $y . ' ' . strtoupper($x));
        break;
}

了解$ x可以采用的值也将有帮助。

答案 2 :(得分:0)

如果要最大程度地减少代码重复,可以将代码分为三个部分:确定排序顺序,确定列名和进行查询。例如:

// determination of sort order
$sortOrder = (strtoupper($x) == 'DESC' ? 'DESC' : 'ASC');


// determination of column name
switch ($y) {
    case 'l.text':           
        $column = 'numeric_text';
        break;
}

// making of a query
$query->order($column . $sortOrder . ', ' . $y . ' ' . $sortOrder);

当然,您可以使用代码的那些部分来创建函数或方法(如果使用OOP)。例如:

/**
 * determination of sort order
 */
function getSortOrder($x)
{
    return strtoupper($x) == 'DESC' ? 'DESC' : 'ASC';
}

/**
 * determination of column name
 */
function getColumn($y)
{
    switch ($y) {
        case 'l.text':           
            return 'numeric_text';
            break;
    }
}

/**
 * making of a query
 */
function addOrder($query, $x, $y) 
{
    $sortOrder = getSortOrder($x);
    $column = getColumn(y);
    $query->order($column . $sortOrder . ', ' . $y . ' ' . $sortOrder);
}

此外,如果您有许多列,则可以使用映射而不是case语句。这将使您的代码更易于阅读。例如:

// determination of column name
$map = [
   'l.text' => 'numeric_text'
];
$column = key_exists($y, $map) ? $map[$y] : 'default_column'

答案 3 :(得分:0)

为什么不使用三元运算符的简写

<?php
$sortOrder = $sortOrder ?: 'ASC';

switch ($y) {
    case 'l.text':
        $query->order("numeric_text {$sortOrder},{$y} {$sortOrder}");
        break;
}