簡體   English   中英

獲取層次結構數據Node.js-Sequelize.js-MySQL

[英]Get hierarchical structure data nodejs - sequelizejs - mysql

這是表文件夾

id  name                    isSub   parentid    status
------------------------------------------------------
1   Main Folder1            0       NULL        1
2   Main Folder2            0       NULL        1
3   Sub Main Fol2           1       2           1
4   Sub Main Fol2           1       3           1
5   Sub Main Fol1           1       1           1
6   Sub Main Fol1           1       1           1
7   Main Folder3            0       NULL        1
8   Sub Main Fol1           1       1           1
------------------------------------------------------

這是我用於獲取層次結構的表。 我正在使用nodejs-sequelizejs 這是我的模特

sequelize.define('Folders', {
        id: {
            type: Sequelize.INTEGER,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING(100),
            allowNull: false,
            validate: {
                len: [1, 100]
            }
        },
        isSub: {
            type: Sequelize.ENUM(),
            values: ['0', '1'],
            allowNull: false,
            defaultValue: '0'
        },
        parentid: {
            type: Sequelize.INTEGER,
            allowNull: true,
            validate: {
                isNumeric: true
            }
        },
        status: {
            type: Sequelize.ENUM(),
            values: ['0', '1', '2'],
            allowNull: false,
            defaultValue: '1'
        },
    },
    {
        tableName: 'folders'
    }
);

Folders.associate = function(models) {
    models.Folders.hasMany(models.Folders, {
      foreignKey: 'parentid',
      as: 'children'
    });
};

和我的控制器功能來獲取列表

models.Folders.findAll({
        where: {
            isSub : 1,
            status : '1',
        },
        include: [{
          model: models.Folders,
          as: 'children',
          where: {
              status: '1'
          },
            required: false
        }],
        required: false
    }).then((data) => {

    data.map((foldData) => {
        return Object.assign({}, {
            fid: foldData['id'],
            fName: foldData['name'],
            fisSub: (foldData['isSub'] === '1')? 'Yes': 'No',
            subFolders:
            foldData['children'].map((sfoldData, index) => {

                return Object.assign({}, {
                    sfid: sfoldData['id'],
                    sfName: sfoldData['name'],
                    sisSubFold: (sfoldData['isSub']) === '1'? 'Yes': 'No',
                })
            }),
        });
    });
});

通過上面的代碼,我得到如下所示的API調用結果

[
    {
        "fid": "2",
        "fName": "Main Folder2",
        "fisSub": "No",
        "subCategory": [
            {
                "sfid": "3",
                "sfName": "Sub Main Fol2",
                "sisSubFold": "Yes"
            }
        ]
    },
    {
        "fid": "1",
        "fName": "Main Folder1",
        "fisSub": "No",
        "subCategory": [
            {
                "sfid": "5",
                "sfName": "Sub Main Fol1",
                "sisSubFold": "Yes"
            },
            {
                "sfid": "6",
                "sfName": "Sub Main Fol1",
                "sisSubFold": "Yes"
            },
            {
                "sfid": "8",
                "sfName": "Sub Main Fol1",
                "sisSubFold": "Yes"
            }
        ]
    },
    {
        "fid": "7",
        "fName": "Main Folder3",
        "fisSub": "No",
        "subCategory": []
    }
]

對於“ fid”,這里:“ 2”在表中具有兩級層次結構,但是我僅獲得第一級。

請更正我的代碼以獲得分層結構。

注意:將有許多層次結構,不僅是第二/第三/不久的級別。 我搜索了很多東西,但沒有找到正確的東西。 請幫助我。

提前致謝

您想要做的是遞歸查詢,Sequelize尚不支持遞歸查詢,這里有一個建議https://github.com/sequelize/sequelize/issues/4890 ,解決方法是使用raw函數編寫自己的函數CTE要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM