繁体   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