DataTables 服务器端处理 - 如何添加不是来自数据库的计算列值?

Posted

技术标签:

【中文标题】DataTables 服务器端处理 - 如何添加不是来自数据库的计算列值?【英文标题】:DataTables Server-side Processing - How to add calculated column values not from database? 【发布时间】:2022-01-21 07:28:24 【问题描述】:

我在下面的例子 https://datatables.net/examples/data_sources/server_side

在示例代码中,列数据从数据库返回,如下代码所示

$columns = array(
    array( 'db' => 'first_name', 'dt' => 0 ),
    array( 'db' => 'last_name',  'dt' => 1 ),
    array( 'db' => 'position',   'dt' => 2 )
    );

我需要添加第 4 列评级,该值不是来自数据库,而是在 php 函数中计算的。我该怎么做?

array( 'db' => 'rating', 'dt' => 3 ) // 需要从 php 函数中获取值

下面是示例中的服务器端php代码,

$table = 'datatables_demo';
 
// Table's primary key
$primaryKey = 'id';
 
// Array of database columns which should be read and sent back to DataTables.
// The `db` parameter represents the column name in the database, while the `dt`
// parameter represents the DataTables column identifier. In this case simple
// indexes
$columns = array(
    array( 'db' => 'first_name', 'dt' => 0 ),
    array( 'db' => 'last_name',  'dt' => 1 ),
    array( 'db' => 'position',   'dt' => 2 ),
    array( 'db' => 'office',     'dt' => 3 ),
    array(
        'db'        => 'start_date',
        'dt'        => 4,
        'formatter' => function( $d, $row ) 
            return date( 'jS M y', strtotime($d));
        
    ),
    array(
        'db'        => 'salary',
        'dt'        => 5,
        'formatter' => function( $d, $row ) 
            return '$'.number_format($d);
        
    )
);
 
$sql_details = array(
    'user' => '',
    'pass' => '',
    'db'   => '',
    'host' => ''
);
 
require( 'ssp.class.php' );
 
echo json_encode(
    SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns )
);

【问题讨论】:

将sql结果作为数组添加到数组中,使用foreach函数 @Undry 怎么样?数据输出在 SSP::simple 函数中生成。 请阅读有关 mysql 的更多信息,通常结果是关联数组,您可以使用 foreach 函数浏览它,使用相同的函数您可以将新字段添加到结果数组中 【参考方案1】:

你可以试试 $columns[] = [ 'db' => 'rating', 'dt' => 3];

<?php

$columns = array(
    array( 'db' => 'first_name', 'dt' => 0 ),
    array( 'db' => 'last_name',  'dt' => 1 ),
    array( 'db' => 'position',   'dt' => 2 )
    );

$columns[] = [ 'db' => 'rating', 'dt' => 3 ];

print_r($columns);

【讨论】:

您好,这仅添加到列定义表示从数据库字段获取数据。我需要这个特定列的定义或方法来从 php 函数获取数据。 同理,你只需要计算你需要的数据,并将计算的数据作为我提供的代码附加到原始数组中【参考方案2】:

找到答案

https://datatables.net/forums/discussion/49799/datatable-ssp-class-php

需要修改ssp.class.php中的data_output函数

static function data_output ( $columns, $data )
    
        $out = array();
 
        for ( $i=0, $ien=count($data) ; $i<$ien ; $i++ ) 
        $row = array();
            $params = array();
            for ( $j=0, $jen=count($columns) ; $j<$jen ; $j++ ) 
        $column = $columns[$j];
 
                // Is there a formatter?
        if ( isset( $column['formatter'] ) ) 
                    $row[ $column['dt'] ] = $column['formatter']( $data[$i][ $column['db'] ], $data[$i] );
                
 
        // Do we need to compute?
                elseif (isset( $column['compute'] ) ) 
                    $params[ $column['dt'] ]['compute'] = $column['compute'];
                    $params[ $column['dt'] ]['params'][] = $data[$i][ $columns[$j]['db'] ];
                
 
                else 
                    $row[ $column['dt'] ] = $data[$i][ $columns[$j]['db'] ];
                
 
            
 
            if ( !empty( $params ) ) 
 
                foreach ( $params as $dt => $parameters) 
                    $parameterStr = "";
                    foreach ( $parameters['params'] as $p) 
                        $parameterStr .= "$p,";
                    
                    $parameterStr = rtrim($parameterStr,",");
                    $row[ $dt ] = self::$parameters['compute']($parameterStr);
                
            
            ksort($row);
            $out[] = $row;
        
 
        return $out;
    
 
    static function shippingMethod($parameterString) 
        $output = "";
        $parameters = explode(",",$parameterString);
        foreach($parameters as $p)
            $output .= "(".$p .")";
        return $output;
    
 
    static function konka($parameterString) 
        $output = "";
        $parameters = explode(",",$parameterString);
        foreach($parameters as $p)
            $output .= "***".$p ."***";
        return $output;
    

【讨论】:

以上是关于DataTables 服务器端处理 - 如何添加不是来自数据库的计算列值?的主要内容,如果未能解决你的问题,请参考以下文章

Datatables + PHP:多表的服务器端处理

如何使用 Datatables.AspNet.Mvc5 进行服务器端排序

jquery datatables添加带有ajax服务器端响应的复选框

如何在没有 Ajax 的 JQuery DataTables 中使用服务器端处理

jquery Datatables - 如何实现服务器端获取和客户端排序

如何使用 jQuery dataTables 启用服务器端搜索?