Sequelize: getOne () выбрасывает «Неизвестный столбец (...) в списке полей», если положение не основано на PK и работает для поиска PK - PullRequest
0 голосов
/ 20 апреля 2020

Я использую функцию getOne() для извлечения пользовательских данных с соответствующими моделями. Если я использую PK в предложении where следующим образом: where: { ID: 128 } - он работает нормально . Это означает, что ассоциации и настройки запросов верны.

Но если я пытаюсь найти пользователя по полю email, например: where: { email: 'email_of@user_with_ID_128.com' } - Sequelize выдает ошибку Unknown column (...) in field list для полей самого глубокого связанные модели. Адрес электронной почты правильный, и он указывает на того же пользователя, что и поиск по идентификатору. Если я исключаю связи из конфигурации запроса или задаю required: false - запрос успешен, и пользователь может быть найден с помощью email.

Это строка запроса:

return models.User.findOne(config).then(user => { console.log(user) });

И объект options / config:

config = {
    where: { ID: 128 }, // THIS WORKS
    // OR
    where: { email: 'email_of@user_with_ID_128.com' }, // THIS THROWS ERROR
    include: [
        {
            nested: true,
            model: models.UserComponent,
            attributes: ['ID', 'isDisplayed', 'displayIndex'],
            include: [
                {
                    model: models.Component,
                    required: true,
                    include: [
                        {
                            model: models.ComponentType, // error relates to this model
                            required: true // doesn't throw error if set to false
                        },
                        {
                            model: models.ObjectType, // and error relates to this model
                            required: true // doesn't throw error if set to false
                        },
                        {
                            model: models.ComponentContent,
                            required: false
                        }
                    ]
                }
            ]
        }
    ],
    nested: true    
};

Определения моделей:

const User = connectionPool.define('user', {
    ID: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
        primaryKey: true
    },
    name: {
        type: Sequelize.STRING,
        allowNull: false,
    },
    email: {
        type: Sequelize.STRING,
        allowNull: false
    },
    surname: {
        type: Sequelize.STRING,
        allowNull: false,
    }
});
const Component = connectionPool.define('component', {
    ID: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
        primaryKey: true
    },
    defaultIsDisplayed: {
        type: Sequelize.BOOLEAN,
        allowNull: false
    },
    defaultDisplayIndex: {
        type: Sequelize.INTEGER,
        allowNull: false
    },
    obligatory: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
        default: false
    }
}, {
    defaultScope: {
        attributes: {
            exclude: ['createdAt', 'updatedAt',
                'componentContentID', 'objectTypeID',
                'componentTypeID']
        }
    }
}
);

const UserComponent = connectionPool.define('user_component', {
    ID: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
        primaryKey: true
    },
    isDisplayed: {
        type: Sequelize.BOOLEAN,
        allowNull: false
    },
    displayIndex: {
        type: Sequelize.INTEGER,
        allowNull: false
    }
}, {
    defaultScope: {
        attributes: { exclude: ['createdAt', 'updatedAt', 'componentID', 'userID', 'ID'] }
    }
});

const ComponentType = connectionPool.define('component_type', {
    ID: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
        primaryKey: true
    },
    name: {
        type: Sequelize.STRING,
        allowNull: false
    }
}, {
    defaultScope: {
        attributes: { exclude: ['ID', 'createdAt', 'updatedAt'] }
    }
});
const ComponentContent = connectionPool.define('component_content', {
    ID: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
        primaryKey: true
    },
    content: {
        type: Sequelize.STRING,
        allowNull: false
    }
});

Ассоциации:

models.Component.belongsTo(models.ComponentContent, { foreignKey: 'componentContentID', onDelete: 'CASCADE' });
models.Component.belongsTo(models.ComponentType, { foreignKey: 'componentTypeID', onDelete: 'CASCADE' });
models.Component.belongsTo(models.ObjectType, { foreignKey: 'objectTypeID', onDelete: 'CASCADE' });

models.Component.hasMany(models.UserComponent, { foreignKey: 'componentID', onDelete: 'CASCADE' });
models.UserComponent.belongsTo(models.Component, { foreignKey: 'componentID', onDelete: 'CASCADE' });
models.User.hasMany(models.UserComponent, { foreignKey: 'userID', onDelete: 'CASCADE' });

Я не вижу логической причины, по которой в запрос правильно добавляются ассоциации если оператор where основан на PK и не может сделать это для другого поля в качестве условия. Документация не дает никаких подсказок. Кто-нибудь знает, что может быть причиной такого поведения? Я хотел бы избежать предварительного поиска user для ID или не требовать связанных моделей.

...