【问题标题】:Datatables server side processing and column alias数据表服务器端处理和列别名
【发布时间】:2013-10-21 12:17:23
【问题描述】:

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

目前这适用于:

$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,因此它需要正确设置该值

谢谢

【问题讨论】:

    标签: datatables


    【解决方案1】:

    是的。实际上,我自己只是在这个问题上苦苦挣扎。因为 JSON 输出是通过计算数组中的列数确定的,并且由于内爆数组,您必须将列别名添加到 $sQuery 而不是 $aColumns 数组。因此,您的 $aColumns 数组中的列实际上会比您需要的少一列。例如,在我的情况下,我需要一个名为 total 的别名,该别名是通过将价格和数量相乘而创建的。所以我把我所有的非别名列放在 $aColumns 数组中,像这样:

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

    但是,在 $sQuery 字符串中,它连接了创建正确查询字符串所需的所有内容,我在 implode 和 FROM 之间添加了我的列别名。不过不要忘记在 implode 之后加一个逗号,因为它不会为你添加它。原始 $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&lt;count($aColumns) 更改为$i&lt;count($aColumns) + 1,因为我的别名使列计数比数组中的计数高一。我添加了一个包装 if-else,它只是说如果计数器 $i 高于我在 $aColumns 数组中指定的列数,那么我们已经将数组中的所有列添加到输出数据,所以因为我只添加了一个额外的别名列,所以这意味着我可以继续并将其添加到 $row 数组中,该数组包含返回行的所有输出数据。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-06
      • 2016-06-21
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多