如何从不同的表中呈现数据表中单元格中的多行?

How to render multiple row in a cell in Datatables from a different table?

提问人:Bearded 提问时间:8/22/2020 最后编辑:Bearded 更新时间:8/23/2020 访问量:921

问:

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

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"}
    ]
});

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

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

$('#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 个类别。 提前致谢。

JavaScript PHP AJAX 数据表 服务器端

评论


答:

1赞 M Khalid Junaid 8/22/2020 #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,但它有最大字符限制(可调整)的限制。

评论

0赞 Bearded 8/23/2020
你好兄弟,我想出了一个新问题,你能帮我解决这个问题吗?请检查我问题的下半部分。
0赞 M Khalid Junaid 8/23/2020
@Bearded 如果你能问一个新问题,那就太好了,因为更新你的问题会使这个答案无效,也请为我提供一个新问题的链接
0赞 Bearded 8/23/2020
好。。我在上面..请稍等。
0赞 Bearded 8/23/2020
请检查我的问题