【问题标题】:How to render multiple row in a cell in Datatables from a different table?如何从不同的表中呈现数据表中的单元格中的多行?
【发布时间】:2020-12-11 13:39:59
【问题描述】:

我正在使用数据表创建一个表,但在其中呈现数据时遇到了一些问题。我的表结构是。

TABLE_1
|------|------|-------|
|  ID  | NAME | PHONE |
|------|------|-------|
TABLE_2
|------|------------|----------|
|  ID  | TABLE_1_ID | CATEGORY |
|------|------------|----------|

这是我的 PHP 代码

$db  = new Database; // Database connection
$sql = "SELECT a.*, b.* FROM TABLE_1 a, TABLE_2 b WHERE a.ID = b.TABLE_1_ID";
$exe = $db->select($sql);
$result = array();
foreach ($exe as $rows) {
    $result[] = $rows;
}
echo json_encode($result);

这是我的 JavaScript

$('#example').DataTable({
    ajax: {
        url:"data.php",
        dataSrc:""
    },
    columns: [
        {data:"NAME"},
        {data:"CATEGORY"}
    ]
});

到目前为止,一切正常,数据已完美加载。但问题是,假设我在TABLE_1 中只有一行,TABLE_2 中只有 5 行,其中TABLE_1.ID = TABLE_2.TABLE_1_ID 和 bcoz 我的数据表正在生成 5 行,但我想要一个单元格中的所有类别,我只想要1 行而不是 5 行。

我正在考虑在渲染函数中做一些事情,比如

$('#example').DataTable({
    ajax: {
        url:"data.php",
        dataSrc:""
    },
    columns: [
        {data:"NAME"},
        {
            data:"ID",
            render: function(data, type, row){
                // Some stuff to render 5 Category in a single cell
                // Using the ID from row.ID (maybe)
                // how to return 5 CATEGORY in this cell
            }
        }
    ]
});

但我真的不知道这个过程,而且 google + stackoverflow + datatables 论坛对我来说有点混乱,因为我不擅长 Javascript。 你们能帮我实现这个吗?我必须在渲染函数中编写什么类型的代码或什么代码才能在单个单元格中显示 5 CATEGORY。 提前致谢。

【问题讨论】:

    标签: javascript php ajax datatables server-side


    【解决方案1】:

    您可以在应用程序层中转换数据,以便在结果数组中只有表 a 的行以及相关的类别名称。

    首先你需要一个有序的结果集,比如

    select a.id,
      a.phone,
      a.name,
      b.category 
    from table_1 a
    join table_2 b 
      on a.id = b.table_1_id
    order by a.id asc
    

    然后遍历所有记录并烹饪您的数据集

    $result = [];
    $currentParent = false;
    $data = null;
    foreach ($rows as $row) {
        /* 
         * if id is changed then its a different record
         * prepare data for new row and create a comma separated string of category names
         */
        if ($currentParent != $row['id']) {
            if($data != null){ // for first and intermediate rows
                $result[]= $data;
            }
            $data = ['name'=> $row['name'], 'category'=> ''];
            $currentParent = $row['id'];
        }
        $data['category'] = empty($data['category']) ? $row['category']: $data['category'] .", ". $row['category'];
    }
    $result[]= $data; // add data for last row
    echo json_encode($result);
    

    结果数组看起来像

    Array
    (
        [0] => Array
            (
                [name] => item 1
                [category] => Cat 1, Cat 2, Cat3
            )
    
        [1] => Array
            (
                [name] => item 2
                [category] => Cat 1, Cat 2, Cat3
            )
    
        [2] => Array
            (
                [name] => item 3
                [category] => Cat 1, Cat 2, Cat3
            )
    
    )
    

    另一种速记方法但不是首选方法是在查询级别应用聚合方法,例如,如果您使用 MySQL,则可以使用 group_concat,但它有最大字符数限制(可调整)。

    【讨论】:

    • 你好兄弟,我又遇到了一个新问题,你能帮我解决这个问题吗?请检查我的问题的下部。
    • @Bearded 如果你能提出一个新问题会很好,因为更新你的问题会使这个答案无效,也请给我一个新问题的链接
    • 好的..我正在处理它..请稍等。
    • 请查看我的Question
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多