Как мне перекрыть столбцы как вложенный массив? NodeJS / MySQL (mysql2) - PullRequest
1 голос
/ 31 января 2020

На самом деле я пытаюсь получить результат mysql как данные вложенного массива, которые я много раз пытался использовать с этим основным. js код, полученный из github node- mysql -nesting . Думать о ? почему мне нужно использовать эту функцию для преобразования результатов запроса в виде вложенного массива, который кто-нибудь знает, поможет мне в этих сегментах

let options = { sql: "SELECT 
        units.name as unit_name ,
        units.id as unit_id, units.description as unit_description ,
        classes.name as class_name , classes.academic_year as class_academic_year , semesters.name as semester,
        standards.name as standard,
        branches.name as branch,
        sections.name as section,
        chapters.id as chapter_id,
        chapters.name as chapter_name,
        chapters.unit_id as chapter_unit_id,
        chapters.description as chapter_description
        FROM units 
         LEFT JOIN chapters ON chapters.unit_id = units.id
        JOIN classes ON classes.id = units.class_id 
        JOIN courses ON courses.id = units.course_id 
        JOIN users ON users.id = units.created_by 
        JOIN branches ON branches.id = classes.branch_id 
        JOIN semesters ON semesters.id = classes.semester_id 
        JOIN sections ON sections.id = classes.section_id 
        JOIN standards ON standards.id = classes.standard_id", nestTables: true };

 database.query(options).then(([classes, classesFields]) => {
        if (classes) {
            var func = require('../../config/main')

            let data = {
                nested: func.convertToNested(classes, nestingOptions),
                original: classes
            }
            res.send(Response.successResponseWithData(SuccessMessage.DataFetched, data))
        }
        else {
            res.send(Response.failureResponse(FailureMessage.DataFetchFailed))
        }
    }).catch(err => {
        console.log(err)
        res.send(Response.failureResponse(FailureMessage.DataFetchFailed))
    })

Что я получаю, это

{
    "status": true,
    "status_code": 200,
    "message": "DATA FETCHED SUCCESSFULLY",
    "data": {
        "nested": [
            {
                "unit_name": "UNIT I",
                "unit_id": 1,
                "unit_description": "UNIT I Delivers all contents "
            },
            {
                "unit_name": "UNIT II",
                "unit_id": 2,
                "unit_description": "UNIT II Delivers all contents "
            }
        ],
        "original": [
            {
                "units": {
                    "unit_name": "UNIT I",
                    "unit_id": 1,
                    "unit_description": "UNIT I Delivers all contents "
                },
                "classes": {
                    "class_name": "I Standard B Section",
                    "class_academic_year": 2020
                },
                "semesters": {
                    "semester": "I"
                },
                "standards": {
                    "standard": "1st Standard"
                },
                "branches": {
                    "branch": "Computer Science"
                },
                "sections": {
                    "section": "A"
                },
                "chapters": {
                    "chapter_id": 7,
                    "chapter_name": "MARS",
                    "chapter_unit_id": 1,
                    "chapter_description": "Mars is the fourth planet from the Sun and the second-smallest planet in the Solar System after Mercury. In English, Mars carries a name of the Roman god of war and is often referred to as the 'Red Planet'.[15][16] The latter refers to the effect of the iron oxide prevalent on Mars' surface, which gives it a reddish appearance distinctive among the astronomical bodies visible to the naked eye.[17] Mars is a terrestrial planet with a thin atmosphere, having surface features reminiscent both of the impact craters of the Moon and the valleys, deserts, and polar ice caps of Earth."
                }
            },
            {
                "units": {
                    "unit_name": "UNIT I",
                    "unit_id": 1,
                    "unit_description": "UNIT I Delivers all contents "
                },
                "classes": {
                    "class_name": "I Standard B Section",
                    "class_academic_year": 2020
                },
                "semesters": {
                    "semester": "I"
                },
                "standards": {
                    "standard": "1st Standard"
                },
                "branches": {
                    "branch": "Computer Science"
                },
                "sections": {
                    "section": "A"
                },
                "chapters": {
                    "chapter_id": 8,
                    "chapter_name": "Jupiter",
                    "chapter_unit_id": 1,
                    "chapter_description": "Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. Jupiter is one of the brightest objects visible to the naked eye in the night sky, and has been known to ancient civilizations since before recorded history. It is named after the Roman god Jupiter.[18] When viewed from Earth, Jupiter can be bright enough for its reflected light to cast shadows,[19] and is on average the third-brightest natural object in the night sky after the Moon and Venus."
                }
            },
            {
                "units": {
                    "unit_name": "UNIT II",
                    "unit_id": 2,
                    "unit_description": "UNIT II Delivers all contents "
                },
                "classes": {
                    "class_name": "I Standard B Section",
                    "class_academic_year": 2020
                },
                "semesters": {
                    "semester": "I"
                },
                "standards": {
                    "standard": "1st Standard"
                },
                "branches": {
                    "branch": "Computer Science"
                },
                "sections": {
                    "section": "A"
                },
                "chapters": {
                    "chapter_id": null,
                    "chapter_name": null,
                    "chapter_unit_id": null,
                    "chapter_description": null
                }
            }
        ]
    }
}

Мое ожидание

{
    "status": true,
    "status_code": 200,
    "message": "DATA FETCHED SUCCESSFULLY",
    "data": {
        "nested": [
            {
                "unit_name": "UNIT I",
                "unit_id": 1,
                "unit_description": "UNIT I Delivers all contents "
"chapters": [
                    {
                        "chapter_id": 7,
                        "chapter_name": "MARS",
                        "chapter_unit_id": 1,
                        "chapter_description": "Mars is the fourth planet from the Sun and the second-smallest planet in the Solar System after Mercury. In English, Mars carries a name of the Roman god of war and is often referred to as the 'Red Planet'.[15][16] The latter refers to the effect of the iron oxide prevalent on Mars' surface, which gives it a reddish appearance distinctive among the astronomical bodies visible to the naked eye.[17] Mars is a terrestrial planet with a thin atmosphere, having surface features reminiscent both of the impact craters of the Moon and the valleys, deserts, and polar ice caps of Earth."
                    },
                    {
                        "chapter_id": 8,
                        "chapter_name": "Jupiter",
                        "chapter_unit_id": 1,
                        "chapter_description": "Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. Jupiter is one of the brightest objects visible to the naked eye in the night sky, and has been known to ancient civilizations since before recorded history. It is named after the Roman god Jupiter.[18] When viewed from Earth, Jupiter can be bright enough for its reflected light to cast shadows,[19] and is on average the third-brightest natural object in the night sky after the Moon and Venus."
                    }
                ],
            },
            {
                "unit_name": "UNIT II",
                "unit_id": 2,
                "unit_description": "UNIT II Delivers all contents "
            }
        ],
        "original": [
            {
                "units": {
                    "unit_name": "UNIT I",
                    "unit_id": 1,
                    "unit_description": "UNIT I Delivers all contents "
                },
                "classes": {
                    "class_name": "I Standard B Section",
                    "class_academic_year": 2020
                },
                "semesters": {
                    "semester": "I"
                },
                "standards": {
                    "standard": "1st Standard"
                },
                "branches": {
                    "branch": "Computer Science"
                },
                "sections": {
                    "section": "A"
                },
                "chapters": {
                    "chapter_id": 7,
                    "chapter_name": "MARS",
                    "chapter_unit_id": 1,
                    "chapter_description": "Mars is the fourth planet from the Sun and the second-smallest planet in the Solar System after Mercury. In English, Mars carries a name of the Roman god of war and is often referred to as the 'Red Planet'.[15][16] The latter refers to the effect of the iron oxide prevalent on Mars' surface, which gives it a reddish appearance distinctive among the astronomical bodies visible to the naked eye.[17] Mars is a terrestrial planet with a thin atmosphere, having surface features reminiscent both of the impact craters of the Moon and the valleys, deserts, and polar ice caps of Earth."
                }
            },
            {
                "units": {
                    "unit_name": "UNIT I",
                    "unit_id": 1,
                    "unit_description": "UNIT I Delivers all contents "
                },
                "classes": {
                    "class_name": "I Standard B Section",
                    "class_academic_year": 2020
                },
                "semesters": {
                    "semester": "I"
                },
                "standards": {
                    "standard": "1st Standard"
                },
                "branches": {
                    "branch": "Computer Science"
                },
                "sections": {
                    "section": "A"
                },
                "chapters": {
                    "chapter_id": 8,
                    "chapter_name": "Jupiter",
                    "chapter_unit_id": 1,
                    "chapter_description": "Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. Jupiter is one of the brightest objects visible to the naked eye in the night sky, and has been known to ancient civilizations since before recorded history. It is named after the Roman god Jupiter.[18] When viewed from Earth, Jupiter can be bright enough for its reflected light to cast shadows,[19] and is on average the third-brightest natural object in the night sky after the Moon and Venus."
                }
            },
            {
                "units": {
                    "unit_name": "UNIT II",
                    "unit_id": 2,
                    "unit_description": "UNIT II Delivers all contents "
                },
                "classes": {
                    "class_name": "I Standard B Section",
                    "class_academic_year": 2020
                },
                "semesters": {
                    "semester": "I"
                },
                "standards": {
                    "standard": "1st Standard"
                },
                "branches": {
                    "branch": "Computer Science"
                },
                "sections": {
                    "section": "A"
                },
                "chapters": {
                    "chapter_id": null,
                    "chapter_name": null,
                    "chapter_unit_id": null,
                    "chapter_description": null
                }
            }
        ]
    }
}

В моей главной. js

/**
 * Kyle Ladd, 2015
 * See project's Github page for usage details.
 * https://github.com/kyleladd
 */
/** 
 * Originally forked from
 * Selman Kahya, 2013
 * See project's Github page for usage details.
 * https://github.com/Selmanh
 */

/**
 * takes nested mysql result array as a parameter,
 * converts it to a nested object
 *
 * @param {Array} rows
 * @param {Array} nestingOptions
 * @return {Object}
 */
exports.convertToNested = function (rows, nestingOptions) {

    if (rows == null || nestingOptions == null)
        return rows;

    var levels = nestingOptions;

    // put similar objects in the same bucket (by table name)
    var buckets = new Array();

    for (var i = 0; i < levels.length; i++) {
        var result = new Array();

        var level = levels[i];

        var pkey = level.pkey;
        var tableName = level.tableName;

        for (var j = 0; j < rows.length; j++) {
            var object = rows[j][tableName];

            // check if object has key property
            if (object == null){
                console.log("Error: couldn't find " + tableName + " property in mysql result set")
                continue;
            }

            // if object isn't in result array, then push it
            if(!isExist(result, pkey, object[pkey]) && object[pkey] != null)
                result.push(object);
        }
        // Buckets should have two properties, a table name (to identify for relationships) and values.
        buckets.push({table:tableName,values:result});
    }           

    // we have similar objects in the same bucket
    // now, move lower level objects into related upper level objects where relationship key values match
    for (var i = buckets.length-1; i >= 1; i--) {
        // For each upper bucket
        for (var u = i-1; u >= 0; u--) {
            if(levels[u].hasOwnProperty('fkeys')){
                //Go through upper buckets foreign keys
                for (var f = 0; f < levels[u].fkeys.length; f++) {
                    // if upper bucket has a foreign key to this bucket's table
                    if(buckets[i].table == levels[u].fkeys[f].table){
                        // For each element in this table
                        for (var ft = 0; ft < buckets[i].values.length; ft++){
                            // Go through each element in upper table matching values with this bucket's values
                            for (var utv = 0; utv < buckets[u].values.length; utv++){
                                // Relationship match
                                if(buckets[i].values[ft][levels[i].pkey] == buckets[u].values[utv][levels[u].fkeys[f].col]){
                                    // Shouldn't be a list because there can only one, fk can only match one pk
                                    buckets[u].values[utv][buckets[i].table] = buckets[i].values[ft];
                                }
                            }
                        }
                    }
                }
            }
        }
        //CHECK TO SEE IF THIS BUCKET HAS THE FOREIGN KEY USED IN AN UPPER LEVEL
        if(levels[i].hasOwnProperty('fkeys')){
            for (var cf = 0; cf < levels[i].fkeys.length; cf++) {
                // For each upper bucket
                for (var ub = i-1; ub >= 0; ub--) {
                    if( levels[i].fkeys[cf].table == levels[ub].tableName){
                        // For each element in this table
                        for (var ct = 0; ct < buckets[i].values.length; ct++){
                            // Go through each element in matching table
                            for (var utbv = 0; utbv < buckets[ub].values.length; utbv++){
                                if(buckets[i].values[ct][levels[i].fkeys[cf].col] == buckets[ub].values[utbv][levels[ub].pkey]){
                                    //If there is a match, create an empty list with the tablename if it doesn't already exist
                                    if(!buckets[ub].values[utbv].hasOwnProperty(levels[i].tableName)){
                                        buckets[ub].values[utbv][levels[i].tableName] = [];
                                    }
                                    // Append object where relationship key values match
                                    buckets[ub].values[utbv][levels[i].tableName].push(buckets[i].values[ct]);
                                }
                            }
                        }
                    }
                }
            }
        }
    }    
    // at the end, we have all the nested objects in the first bucket
    return buckets[0].values;
};

/**
 * checks if one of the objects in an array has the given property,
 * and the value of that property equals to given value
 *
 * @param {Array} array
 * @param {String} key
 * @param {String} value
 * @return {Array}
 */
//
var isExist = function(array, key, value){

    for (var i = 0; i < array.length; i++) {
        if(array[i][key] == value)
            return true;
    }

    return false;
}
...