数据表服务器端处理和列别名

时间:2013-10-21 12:17:24

标签: datatables

在使用服务器端处理的数据表中,是否可以在指定列时使用列别名?

目前这适用于:

$aColumns = array( 'datetime','username', 'user_ip', 'company', 'action' );

但是我想在MySQL中使用日期格式更改日期的格式,所以实际上我想使用:

$aColumns = array( 'DATE_FORMAT(datetime, "%d/%m/%Y - %H:%i:%s") as newdate';'username'; 'user_ip';'company'; 'action' );

问题是别名有一个逗号而且aColumns数组是逗号分隔的,所以它在以后会中断,例如,它来到:

$sQuery = "
    SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
    FROM   $sTable
    $sWhere
    $sOrder
    $sLimit
";

有没有办法可以使用别名而不是原始值?即使只是更改select语句也不起作用,因为整个脚本都使用了aColumns,因此需要正确设置该值

由于

1 个答案:

答案 0 :(得分:2)

是。我其实只是在努力解决这个问题。因为JSON输出是通过计算数组中的列数来确定的,并且由于内爆数组,您必须将列别名添加到$ sQuery而不是$ aColumns数组。因此,您实际上在$ aColumns数组中的列数少于您需要的列数。例如,在我的作品中,我需要一个名为total的别名,它是通过乘以price和qty而创建的。所以我将所有未分配的列放在$ aColumns数组中,如下所示:

$aColumns = array( 'purchaseID', 'dateOfOrder', 'productID', 'price', 'QTY');

但是,在$ sQuery字符串中连接创建正确查询字符串所需的所有内容,我在implode和FROM之间添加了列别名。不要忘记在内爆之后加一个逗号,因为它并没有为你添加它。原始的$ sQuery字符串如下所示:

 $sQuery = "
    SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
    FROM   `$sTable`
    $sWhere
    $dateSql
    $sOrder
    $sLimit
";

但我的添加了列别名,看起来像这样:

$sQuery = "
    SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
    , `price` * `QTY` AS `total` FROM   `$sTable`
    $sWhere
    $dateSql
    $sOrder
    $sLimit
";

最后,你要做的最后一件事是改变实际的JSON输出,以确保在json_encode之前的FOR循环中考虑你的额外列,因为它将项插入$ row数组,成为' aaData' (返回的行数据),根据您在$ aColumns数组中指定的列数,并且因为您遗漏了任何别名,计数将是错误的,并且您将收到错误看起来像是从数据源行中请求了未知参数'。原始FOR循环如下所示:

while ( $aRow = mysql_fetch_array( $rResult ) )
{
    $row = array();
    for ( $i=0 ; $i<count($aColumns) ; $i++ )
    {
        if ( $aColumns[$i] == "version" )
        {
            /* Special output formatting for 'version' column */
            $row[] = ($aRow[ $aColumns[$i] ]=="0") ? '-' : $aRow[ $aColumns[$i] ];
        }
        else if ( $aColumns[$i] != ' ' )
        {
            /* General output */
            $row[] = $aRow[ $aColumns[$i] ];
        }
    }
    $output['aaData'][] = $row;
}

就像我说的那样,这个FOR循环基于$ aColumns数组的COUNT工作,并且因为我已经添加了一个别名,所以它会缩短我的结果。它不会返回包含返回列的数组中的最后一个元素,因此我要将代码更改为如下所示:

for ( $i=0 ; $i<count($aColumns) + 1; $i++ )
    {
        if ($i < count($aColumns)){
            if ( $aColumns[$i] == "version" )
            {
                /* Special output formatting for 'version' column */
                $row[] = ($aRow[ $aColumns[$i] ]=="0") ? '-' : $aRow[ $aColumns[$i] ];
            }
            else if ( $aColumns[$i] != ' ' )
            {
                /* General output */
                $row[] = $aRow[ $aColumns[$i] ];
            }
        }
        else {
            $row[] = $aRow['total'];
        }

    }
    $output['aaData'][] = $row;
}

我改变的是从$i<count($aColumns)$i<count($aColumns) + 1的反制条件,因为我的别名使列数高于数组中的列数。并且我添加了一个包装if-else,只是说如果计数器$ i高于我在$ aColumns数组中指定的列数,那么我们已经添加了所有数组中的列到输出数据,因为我只添加了一个额外的别名列,这意味着我可以继续将其添加到$ row数组,其中包含返回行的所有输出数据。

您实际上可以根据需要添加任意数量的别名列,只需相应地扩展代码即可。希望这有帮助!