Как отобразить несколько строк в ячейке в Datatables из другой таблицы?

Я создаю таблицу с использованием таблиц данных, и у меня возникают проблемы с отображением данных в ней. Структуры моей таблицы.

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 и 5 строк в TABLE_2, где TABLE_1.ID = TABLE_2.TABLE_1_ID и bcoz этой моей таблицы данных генерируют 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 + stackoverflow + datatables немного сбивает меня с толку, потому что я плохо разбираюсь в Javascript. Можете ли вы, ребята, помочь мне достичь этого? Какой тип кода или какой код я должен написать внутри функции рендеринга, чтобы отобразить 5 КАТЕГОРИЙ в одной ячейке. Заранее спасибо.


person Bearded    schedule 22.08.2020    source источник


Ответы (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, но имеет ограничение максимального количества символов (которое можно настроить).

person M Khalid Junaid    schedule 22.08.2020
comment
Привет брат, я придумал новую проблему, не могли бы вы помочь мне решить эту проблему? Пожалуйста, проверьте нижнюю часть моего вопроса. - person Bearded; 23.08.2020
comment
@Bearded Было бы хорошо, если бы вы могли задать новый вопрос, потому что обновление вашего вопроса сделает этот ответ недействительным, также предоставьте мне ссылку на новый вопрос - person M Khalid Junaid; 23.08.2020
comment
Хорошо.. Я на этом.. подождите, пожалуйста. - person Bearded; 23.08.2020
comment
Пожалуйста, проверьте мой вопрос - person Bearded; 23.08.2020