Как объединить атрибуты включенной модели в Sequelize Query

Кто-нибудь знает, как выполнить запрос в Sequelize, где (без учета каламбура SQL) атрибуты включенной модели объединяются с родительской моделью? Модель пользователя, модель user_profile и запрос приведены ниже. Я хотел бы вернуть один объект со следующими атрибутами: ['id', 'username', 'role', 'is_active', 'email', 'first_name', 'last_name']. Спасибо!

  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 }
        })
    }

1 ответ

Обе модели должны быть определены в одном и том же объекте секвелирования.

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'})

Данные запроса, такие как:

sequelize.models.user.findAll({
    include: [
        {
            model: sequelize.models.user_profile,
        }
    ]
}).then((user) => {
    console.log(user);
}).catch((err) => {
    console.log(err);
});
Другие вопросы по тегам