【问题标题】:How to add a field from associated model using Sequelize?如何使用 Sequelize 从关联模型中添加字段?
【发布时间】:2021-03-20 04:50:44
【问题描述】:

我正在使用 Node、Express 和 Sequelize 制作 Web API。我有模型用户和团队(如下所示)。用户有一个引用 Teams.id 的 teamId,并且两者之间存在关联以反映这一点。

用户定义

const User = sequelize.define('User', {
    id: {
        autoIncrement: true,
        type: DataTypes.INTEGER,
        allowNull: false,
        primaryKey: true
    },
    displayName: {
        type: DataTypes.STRING,
        allowNull: false
    },
    teamId: {
        type: DataTypes.INTEGER,
        allowNull: false,
        references: {
            model: 'Team',
            key: 'id'
        }
    }
}

团队定义

const Team = sequelize.define('Team', {
    id: {
        autoIncrement: true,
        type: DataTypes.INTEGER,
        allowNull: false,
        primaryKey: true
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
}

联想

User.belongsTo(Team, { as: 'team', foreignKey: 'teamId' });

查询

Users.findAll({
    include: [
        {
            model: Team,
            as: 'team'
        }
    ]
});

正如预期的那样,这将返回一个用户对象列表,其中添加了“团队”属性,嵌入了相应的团队对象,如下所示:

[
    {
        "id": 1,
        "displayName": "John Smith",
        "teamId": 1,
        "team": {
            "id": 1,
            "name": "My Awesome Team"
        }
    }
]

我的目标是返回 User 对象,但不是将整个 Team 对象嵌入到 team 属性下,我想只添加团队的名称作为属性的值,如下所示:

[
    {
        "id": 1,
        "displayName": "John Smith",
        "teamId": 1,
        "team": "My Awesome Team"
    }
]

有没有办法用 Sequelize 来完成这个?

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    嗯,通过输入我的问题,我想到了更好的方法来搜索答案,我想我马上就找到了一个......

    我找到了this StackOverflow question,提问者正在做我想做的事情。

    解决方案是使用 attributes.include 和 Sequelize.col() 来包含我想要的属性,并在我的包含选项中,使用 attributes: [] 隐藏 Team 对象。

    脱离我在原始帖子中包含的示例,这对我有用,几乎可以提供我想要的确切输出:

    Users.findAll({
        attributes:{
            include: [[Sequelize.col(team.name), 'teamName']]
        }
        include: [
            {
                model: Team,
                as: 'team',
                attributes: []
            }
        ]
    });
    

    输出

    [
        {
            "id": 1,
            "displayName": "John Smith",
            "teamId": 1,
            "teamName": "My Awesome Team"
        }
    ]
    

    由于协会使用别名“team”,我不得不为我的属性命名不同的名称,并使用“teamName”,这非常好,而且可能更可取,因为它更具描述性。

    【讨论】:

      猜你喜欢
      • 2021-08-02
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      相关资源
      最近更新 更多