Sequelize:当基于嵌套关联连接表时如何获得扁平化数据?

Sho*_*v3_ 4 javascript postgresql node.js sequelize.js

我的关系定义如下:

device_data.belongsTo(models.device)
device.belongsTo(models.category)
category.belongsTo(models.role)
Run Code Online (Sandbox Code Playgroud)

我想要获取的是属于特定角色的所有设备数据。现在我有以下工作:

const query = {
    include: [{
        model: device,
        attributes: ['id'],
        include: [{
            model: category,
            attributes: ['id'],
            include: [{
                model: role,
                attributes: ['id'],
                where: {
                    id: {
                        [Op.eq]: roleId,
                    },
                },
                required: true,
            }],
            required: true,
        }],
        required: true,
    }],
};
Run Code Online (Sandbox Code Playgroud)

显然,这会返回如下格式的数据:

{
    "id": 1,
    "created_timestamp": "2019-08-12T12:28:36.194Z",
    "device_id": 1,
    "device_value": 0,
    "initiator_id": 2,
    "device": {
        "id": 1,
        "category": {
            "id": 1,
            "role": {
                "id": 1
            }
        }
    }
},
Run Code Online (Sandbox Code Playgroud)

role嵌套在第三层和第四层的位置role.id

我想要实现的是:

{
    "id": 1,
    "created_timestamp": "2019-08-12T12:28:36.194Z",
    "device_id": 1,
    "device_value": 0,
    "initiator_id": 2,
    "device": 1,
    "category": 1,
    "role": 1
},
Run Code Online (Sandbox Code Playgroud)

如果有人能给我一个提示或者可能是从续集生成这样的数据的查询,我将不胜感激。非常感谢。

小智 9

  1. 要禁用按模型嵌套,请raw: true查询中使用。

  2. 要删除表名称前缀,请将属性重新定位到顶级模型,但添加表别名。

例如:

TopModel.find(
   raw: true,
   attributes : 
   [
    'id', 'created_timestamp',   // from main table
    'device.id'                  // from included table
   ],
   include [{
        model: device,
        attributes: [],  // nothing at this level
   }]
)

// etc, etc,
Run Code Online (Sandbox Code Playgroud)

我只是猜测这device是表别名。如果您收到错误消息(大致)“字段不存在”,请查阅生成的 SQL 以获取正确的别名。

  • 太棒了,这正是我所需要的,我尝试了所有其他组合,不敢相信这是我没有尝试过的唯一组合。肯定是正确答案谢谢 (2认同)