3

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 }
        })
    }
V5NEXT
  • 1,907
  • 4
  • 19
  • 38
lgants
  • 3,665
  • 3
  • 22
  • 33

1 Answers1

0

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);
});
Empty Brain
  • 627
  • 8
  • 24