【问题标题】:How to merge Included Model Attributes on Sequelize Query如何在 Sequelize Query 上合并包含的模型属性
【发布时间】:2018-07-03 03:36:40
【问题描述】:

有谁知道如何在 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 }
        })
    }

【问题讨论】:

    标签: javascript sequelize.js sequelize-cli


    【解决方案1】:

    两个模型都需要定义在同一个 sequelize 对象中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多