简体   繁体   中英

How to merge Included Model Attributes on Sequelize Query

Does anyone know how to perform a query in Sequelize where (no SQL pun intended) included model attributes are merged onto the parent model? The user model, user_profile model, and query are below. I'd like to return a single object with the following attributes: ['id', 'username', 'role', 'is_active', 'email', 'first_name', 'last_name']. Thanks!

  export default function (sequelize, DataTypes) { var User = sequelize.define( 'User', { username: { type: DataTypes.STRING, unique: true }, email: { type: DataTypes.STRING, unique: true }, password_hash: { type: DataTypes.STRING }, role: { type: DataTypes.STRING, defaultValue: 'user' }, is_active: { type: DataTypes.BOOLEAN, defaultValue: true } }, { timestamps: true, freezeTableName: true } ); User.associate = function (models) { models.User.hasOne(models.UserProfile, { foreignKey: 'user_id' }); }; return User; } 'use strict'; export default function (sequelize, DataTypes) { var UserProfile = sequelize.define( 'UserProfile', { first_name: DataTypes.STRING, last_name: DataTypes.STRING }, { timestamps: true, freezeTableName: true } ); UserProfile.associate = function () { // associations can be defined here }; return UserProfile; } async getUserByUsername(username) { return await db.User.findOne({ attributes: [ 'id', 'username', 'role', 'is_active', 'email', ['userProfile.first_name', 'first_name'], ['userProfile.last_name', 'last_name'] ], include: [{ model: db.UserProfile, as: 'userProfile', required: true }], where: { username } }) } 

Both models need to defined in the same sequelize object.

const User = sequelize.define(
    'User',
    {
        username: { type: DataTypes.STRING, unique: true },
        email: { type: DataTypes.STRING, unique: true },
        password_hash: { type: DataTypes.STRING },
        role: { type: DataTypes.STRING, defaultValue: 'user' },
        is_active: { type: DataTypes.BOOLEAN, defaultValue: true }
    },
    { timestamps: true, freezeTableName: true }
);
const UserProfile = sequelize.define(
    'UserProfile',
    {
        first_name: DataTypes.STRING,
        last_name: DataTypes.STRING
    },
    { timestamps: true, freezeTableName: true }
);

user.hasOne(user_profile, {foreignKey: 'user_id'})

Query data like:

sequelize.models.user.findAll({
    include: [
        {
            model: sequelize.models.user_profile,
        }
    ]
}).then((user) => {
    console.log(user);
}).catch((err) => {
    console.log(err);
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM