Вложенное включение в ссылочном отношении не работает в дальнейшем - PullRequest
0 голосов
/ 07 июля 2019

Не получает отфильтрованные отзывы, которые добавляются только подписчиками пользователя. Я получаю все отзывы. Есть как 11 обзоров, и есть только 8, которые добавляются подписчиками пользователя, я хочу 8, но получаю 11. Если я удаляю необходимые из включенных моделей, я получаю все результаты, потому что тогда внутренний запрос удаляется, но если я сохраняю их, я получаю ошибки, как описано ниже:

// user model
const User = sequelize.define('User', {
    userId: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        field: 'user_id'
    },
    active: {
        type: DataTypes.INTEGER,
        defaultValue: 1
    },
}, {
    tableName: 'users',
    timestamps: true,
    paranoid: true
});

//Associations
User.associate = function(models) {
    models.User.belongsToMany(models.User, {
        through: 'Follower',
        foreignKey: 'followingUserId',
        otherKey: 'followedUserId',
        as: 'UserFollower'
    });
};

// follower model
const Follower = sequelize.define('Follower', {
    followingUserId: {
        type: DataTypes.INTEGER,
        allowNull: false,
        field: 'following_user_id'
    },
    followedUserId: {
        type: DataTypes.INTEGER,
        allowNull: false,
        field: 'followed_user_id'
    }
}, {
    tableName: 'follower'
});

// review model
const RestaurantReview = sequelize.define('RestaurantReview', {
    reviewId: {
        type: DataTypes.INTEGER,
        allowNull: false,
        primaryKey: true,
        field: 'review_id',
        autoIncrement: true
    },
    review: {
        type: DataTypes.TEXT,
        allowNull: true,
        field: 'review'
    },
    userId: {
        type: DataTypes.INTEGER,
        allowNull: true,
        field: 'user_id'
    },
}, {
    tableName: 'restaurant_review',
    timestamps: true,
    paranoid: true,

});

//Query I am firing is :

let queryParameters = {
    distinct: true,
    include: [{
        required: true,
        model: User,
        attributes: ['userId','active'],
        include: [{
            required: true,
            model: User,
            attributes: ['userId' ,'active'],
            as: 'UserFollower',
            through: {
                where: { followingUserId: userId },
            }
        }]
    }],
    offset: offsetValue,
    limit: limitValue
};
// END All the query parameters

const reviewsObject = await reviewModel.findAndCountAll( queryParameters );

// Я получаю запрос:

SELECT "RestaurantReview".*, "User->UserFollower"."user_id" AS "User.UserFollower.userId", "User->UserFollower"."active" AS "User.UserFollower.active", "User->UserFollower"."lastMealtime" AS "User.UserFollower.lastMealtime", "User->UserFollower"."userName" AS "User.UserFollower.userName", "User->UserFollower"."email" AS "User.UserFollower.email", "User->UserFollower"."password" AS "User.UserFollower.password", "User->UserFollower"."lastvistDate" AS "User.UserFollower.lastvistDate", "User->UserFollower"."locationId" AS "User.UserFollower.locationId", "User->UserFollower"."socialId" AS "User.UserFollower.socialId", "User->UserFollower"."socialProvider" AS "User.UserFollower.socialProvider", "User->UserFollower"."socialPhoto" AS "User.UserFollower.socialPhoto", "User->UserFollower"."isLoggedIn" AS "User.UserFollower.isLoggedIn", "User->UserFollower"."createdAt" AS "User.UserFollower.createdAt", "User->UserFollower"."updatedAt" AS "User.UserFollower.updatedAt", "User->UserFollower"."deletedAt" AS "User.UserFollower.deletedAt", "User->UserFollower->Follower"."following_user_id" AS "User.UserFollower.Follower.followingUserId", "User->UserFollower->Follower"."followed_user_id" AS "User.UserFollower.Follower.followedUserId", "User->UserFollower->Follower"."createdAt" AS "User.UserFollower.Follower.createdAt", "User->UserFollower->Follower"."updatedAt" AS "User.UserFollower.Follower.updatedAt" FROM (SELECT "RestaurantReview"."review_id" AS "reviewId", "RestaurantReview"."review", "RestaurantReview"."user_id" AS "userId", "RestaurantReview"."restaurant_id" AS "restaurantId", "RestaurantReview"."rating", "RestaurantReview"."approved", "RestaurantReview"."abused", "RestaurantReview"."createdAt", "RestaurantReview"."updatedAt", "RestaurantReview"."deletedAt", "User"."user_id" AS "User.userId", "User"."active" AS "User.active" FROM "restaurant_review" AS "RestaurantReview" INNER JOIN "users" AS "User" ON "RestaurantReview"."user_id" = "User"."user_id" AND ("User"."deletedAt" > '2019-07-06 23:00:03.855 +00:00' OR "User"."deletedAt" IS NULL) WHERE ("RestaurantReview"."deletedAt" > '2019-07-06 23:00:03.855 +00:00' OR "RestaurantReview"."deletedAt" IS NULL) AND ( SELECT "User"."userId" FROM "users" AS "User" INNER JOIN ( "follower" AS "UserFollower->Follower" INNER JOIN "users" AS "UserFollower" ON "UserFollower"."user_id" = "UserFollower->Follower"."followed_user_id" AND "UserFollower->Follower"."following_user_id" = 16) ON "User"."user_id" = "UserFollower->Follower"."following_user_id" AND ("UserFollower"."deletedAt" > '2019-07-06 23:00:03.855 +00:00' OR "UserFollower"."deletedAt" IS NULL) WHERE "RestaurantReview"."user_id" = "User"."userId" LIMIT 1 ) IS NOT NULL LIMIT 12 OFFSET 0) AS "RestaurantReview" INNER JOIN ( "follower" AS "User->UserFollower->Follower" INNER JOIN "users" AS "User->UserFollower" ON "User->UserFollower"."user_id" = "User->UserFollower->Follower"."followed_user_id" AND "User->UserFollower->Follower"."following_user_id" = 16) ON "User.userId" = "User->UserFollower->Follower"."following_user_id" AND ("User->UserFollower"."deletedAt" > '2019-07-06 23:00:03.855 +00:00' OR "User->UserFollower"."deletedAt" IS NULL);

Есть как 11 обзоров, и только 8 добавлены подписками пользователя, я хочу 8, но получаю 11.

Ошибка:

Отладка: обработчик, ошибка SequelizeDatabaseError: столбец User.userId не существует в Query.formatError (/Users/gagankaur/Documents/projects/Save-Earth/backend/node_modules/sequelize/lib/dialects/postgres/query.js:363:16) at query.catch.err (/Users/gagankaur/Documents/projects/Save-Earth/backend/node_modules/sequelize/lib/dialects/postgres/query.js:86:18) в tryCatcher (/Users/gagankaur/Documents/projects/Save-Earth/backend/node_modules/bluebird/js/release/util.js:16:23) в Promise._settlePromiseFromHandler (/Users/gagankaur/Documents/projects/Save-Earth/backend/node_modules/bluebird/js/release/promise.js:512:31) в Promise._settlePromise (/Users/gagankaur/Documents/projects/Save-Earth/backend/node_modules/bluebird/js/release/promise.js:569:18) в Promise._settlePromise0 (/Users/gagankaur/Documents/projects/Save-Earth/backend/node_modules/bluebird/js/release/promise.js:614:10) в Promise._settlePromises (/Users/gagankaur/Documents/projects/Save-Earth/backend/node_modules/bluebird/js/release/promise.js:689:18) в Async._drainQueue (/Users/gagankaur/Documents/projects/Save-Earth/backend/node_modules/bluebird/js/release/async.js:133:16) в Async._drainQueues (/Users/gagankaur/Documents/projects/Save-Earth/backend/node_modules/bluebird/js/release/async.js:143:10) в Immediate.Async.drainQueues (/Users/gagankaur/Documents/projects/Save-Earth/backend/node_modules/bluebird/js/release/async.js:17:14) при runCallback (timers.js: 794: 20) в tryOnImmediate (timers.js: 752: 5) at processImmediate [as _immediateCallback] (timers.js: 729: 5) Отладка: внутренняя, ошибка

Можете ли вы вспомнить, что я делаю не так? Заранее спасибо.

1 Ответ

0 голосов
/ 08 июля 2019

Я просто использовал следующие параметры, чтобы исправить это.

let queryParameters = {
    distinct: true,
    include: [{
        duplicating: false,
        required: true,
        model: User,
        attributes: ['userId','active'],
        include: [{
            model: User,
            attributes: ['userId','active'],
            as: 'UserFollower',
            through: {
                where: { followingUserId: userId },
            },
            duplicating: false,
            required: true,

        }]
    }],
    offset: offsetValue,
    limit: limitValue
};

И, к счастью, это работает. Я получил правильный запрос.ВЫБЕРИТЕ "RestaurantReview". "Review_id" AS "reviewId", "RestaurantReview". "Review", "RestaurantReview". "User_id" AS "userId", "RestaurantReview". "Restaurant_id" AS "restaurantId", "RestaurantReview". "рейтинг "," RestaurantReview "." утверждено "," RestaurantReview "." злоупотреблено "," RestaurantReview "." созданоAt "," RestaurantReview "." updatedAt "," RestaurantReview "." Удалено "," Пользователь "." user_id "AS "User.userId", "User". "Active" AS "User.active", "User-> UserFollower". "User_id" AS "User.UserFollower.userId", "User-> UserFollower". "Active"AS "User.UserFollower.active", "User-> UserFollower-> Follower". "Follow_user_id" AS "User.UserFollower.Follower.followingUserId", "User-> UserFollower-> Follower". "Follow_user_id" AS "Пользователь.UserFollower.Follower.followedUserId "," User-> UserFollower-> Follower "." Созданный "AS" User.UserFollower.Follower.createdAt "," User-> UserFollower-> Follower "." UpdatedAt "AS" User.UserFollower.Follower.updatedAt "FROM" restaurant_review "AS" RestaurantReview "INNER JOIN" пользователи "AS" Пользователь "ON "RestaurantReview". "User_id" = "Пользователь". "User_id" AND ("Пользователь". "Удаленный") "2019-07-08 07: 08: 00.264 +00: 00 'ИЛИ" Пользователь "." Удаленный "IS NULL) INNER JOIN ("follower" AS "User-> UserFollower-> Follower" INNER JOIN "users" AS "User-> UserFollower" ON "User-> UserFollower". "User_id" = "User-> UserFollower->Follower "." Follow_user_id "И" User-> UserFollower-> Follower "." Follow_user_id "= 4) ON" Пользователь "." User_id "=" User-> UserFollower-> Follower "." Follow_user_id "И (" User-> UserFollower "." DeleAt "> '2019-07-08 07: 08: 00.264 +00: 00' ИЛИ" User-> UserFollower "." УдаленоAt "IS NULL) ГДЕ (" RestaurantReview "." УдаленоAt "> '2019-07-08 07: 08: 00.264 +00: 00 'ИЛИ "RestaurantReview". "УдаленоА" НЕТ)

...