如何在来自不同 table 的 Datatable 中的单元格中呈现多行?
How to render multiple row in a cell in Datatables from a different table?
我正在使用数据table创建一个table,但在其中呈现数据时遇到了一些问题。我的 Table 结构是。
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 我的数据 table 正在生成 5 行,但我想要所有类别都在一个单元格中,我只想要一行而不是 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 + Whosebug + datatable 的论坛对我来说有点混乱,因为我不擅长 Javascript。
你们能帮我实现这个目标吗?我必须在渲染函数中编写什么类型的代码或什么代码才能在单个单元格中显示 5 个类别。
提前致谢。
您可以在应用程序层中转换数据,这样在结果数组中您将只有 table 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
)
)
另一种 shorthand 方式但不是首选方式是在查询级别应用聚合方法,如果您使用 MySQL 您可以使用 group_concat
但它有最大字符限制的限制(即调整table)。
我正在使用数据table创建一个table,但在其中呈现数据时遇到了一些问题。我的 Table 结构是。
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 我的数据 table 正在生成 5 行,但我想要所有类别都在一个单元格中,我只想要一行而不是 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 + Whosebug + datatable 的论坛对我来说有点混乱,因为我不擅长 Javascript。 你们能帮我实现这个目标吗?我必须在渲染函数中编写什么类型的代码或什么代码才能在单个单元格中显示 5 个类别。 提前致谢。
您可以在应用程序层中转换数据,这样在结果数组中您将只有 table 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
)
)
另一种 shorthand 方式但不是首选方式是在查询级别应用聚合方法,如果您使用 MySQL 您可以使用 group_concat
但它有最大字符限制的限制(即调整table)。