Как получить последнюю запись из таблицы подписок вместе со всеми записями из таблицы пользователей с левым соединением в sequelize и PostgreSQL

#node.js #postgresql #express #sequelize.js #hapi

Вопрос:

Мне нужна только последняя запись из таблицы подписок вместе со всеми пользователями из таблицы пользователей. Таблица подписки связана с таблицей пользователей с «идентификатором пользователя» в качестве ключа подписки. На данный момент я получаю несколько объектов одного и того же пользователя со всеми записями из таблицы подписок.

ТАБЛИЦА ПОЛЬЗОВАТЕЛЕЙ

 UserModel.init(
    {
        user_id: {
            type: Sequelize.INTEGER,
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
        },
        user_id_converted: {
            type: Sequelize.STRING(100),
            allowNull: true,
        },
        first_name: {
            type: Sequelize.STRING(100),
            allowNull: false,
        },
        last_name: {
            type: Sequelize.STRING(100),
            allowNull: false,
        },
        date_of_birth: {
            type: Sequelize.STRING(20),
            allowNull: true,
        },
        city: {
            type: Sequelize.STRING(70),
            allowNull: false,
        },
        state: {
            type: Sequelize.STRING(70),
            allowNull: false,
        },
        email: {
            type: Sequelize.STRING(65),
            allowNull: false,
        },
        password: {
            type: Sequelize.STRING(300),
            allowNull: false,
        },
        reset_password_token: {
            type: Sequelize.STRING(300),
            allowNull: true,
        },
        is_subscribed: {
            type: Sequelize.BOOLEAN,
            allowNull: false,
            defaultValue: false
        },
        subscribed_till: {
            type: Sequelize.STRING(50),
            allowNull: true,
        },
        is_active: {
            type: Sequelize.BOOLEAN,
            allowNull: false,
            defaultValue: true
        },
        is_deleted: {
            type: Sequelize.BOOLEAN,
            allowNull: false,
            defaultValue: false
        },
        is_blocked: {
            type: Sequelize.BOOLEAN,
            allowNull: false,
            defaultValue: false
        },
        // is_plan_updated: {
        //     type: Sequelize.BOOLEAN,
        //     allowNull: false,
        //     defaultValue: false
        // },
        user_type: {
            type: Sequelize.ENUM(UserConfig.USER_ROLE_TYPE.USER, UserConfig.USER_ROLE_TYPE.GUEST),
            allowNull: false
        },
        plan_value: {
            type: Sequelize.DOUBLE,
            defaultValue: 0,
            allowNull: false
        },
        money_to_invest: {
            type: Sequelize.DOUBLE,
            defaultValue: 0,
            allowNull: false
        },
        willing_to_sell_value: {
            type: Sequelize.DOUBLE,
            defaultValue: 0,
        },
        investor_type: {
            type: Sequelize.ENUM(CONSTANT.INVESTOR_TYPE.AGGRESSIVE, CONSTANT.INVESTOR_TYPE.MODERATE, CONSTANT.INVESTOR_TYPE.PAVE_SUGGESTION),
            allowNull: false,
        },
        investment_type: {
            type: Sequelize.ENUM(CONSTANT.INVESTMENT_TYPE.DIVIDEND, CONSTANT.INVESTMENT_TYPE.TRADITIONAL, CONSTANT.INVESTMENT_TYPE.PAVE_SUGGESTION),
            allowNull: false,
        },
    }, {

    sequelize: connection,
    freezeTableName: true,
    modelName: 'user',
    underscored: true,
    timestamps: true,
});
 

ТАБЛИЦА ПОДПИСОК

 UserSubscriptionModel.init(
    {
        subscription_id: {
            type: Sequelize.INTEGER,
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
        },
        locale: {
            type: Sequelize.STRING(300),
            allowNull: false,
        },
        quantity: {
            type: Sequelize.STRING(300),
            allowNull: false,
        },
        price: {
            type: Sequelize.DOUBLE,
            allowNull: false,
        },
        product_id: {
            type: Sequelize.STRING(300),
            allowNull: false,
        },
        transaction_id: {
            type: Sequelize.STRING(300),
            allowNull: false,
        },
        original_transaction_id: {
            type: Sequelize.STRING(300),
            allowNull: false,
        },
        purchase_date: {
            type: Sequelize.DATE,
            allowNull: false,
        },
        expires_date: {
            type: Sequelize.DATE,
            allowNull: false,
        },
        user_type: {
            type: Sequelize.ENUM(UserConfig.USER_ROLE_TYPE.USER, UserConfig.USER_ROLE_TYPE.GUEST),
            allowNull: false
        },
        event_type: {
            type: Sequelize.ENUM,
            values: Object.values(CONSTANT.SUBSCRIPTION_EVENT_TYPE),
            allowNull: false
        },
        user_id: {
            type: Sequelize.INTEGER,
            allowNull: false,
        }
    }, {
    sequelize: connection,
    freezeTableName: true,
    modelName: 'user_subscription',
    underscored: true,
    timestamps: true,
});
 

What I am doing

 {
            where: filter,
            include: [
                {
                    model: UserSubscriptionModel,
                    as: 'subscription',
                    required: false,
                    // attributes: ['price', 'event_type', 'product_id']
                    // attributes: [[Sequelize.fn('max', Sequelize.col('subscription_id')), 'max']]
                }
            ],
            group: ['user.user_id', 'subscription.subscription_id'],
            subQuery: false,
            raw: true,
        }