Подтвердить что ты не робот

Sequelize, где НЕ

У меня есть модель Article Sequelize, где статьи связаны друг с другом. В некоторых статьях переведены копии других статей. Отношение устанавливается так:

var Article = sequelize.define('Article', {
    type                : DataTypes.ENUM('source', 'translated'),
    sourceArticleId     : DataTypes.INTEGER
});

db.Article.hasMany(db.Article, {
    foreignKey: 'sourceArticleId',
    as        : 'TranslatedArticles'
});

Итак, статья с type = 'source' может иметь много translatedArticles, где type = 'translated'.

Теперь я хочу запросить все source статьи, которые не имеют перевода.

Основываясь на проблеме в проекте Sequelize github, это будет выполнено следующим образом:

Article.findOne({
    where: Sequelize.literal('translatedArticles.sourceArticleId IS NULL'),
    include: [
        {
            model: Article,
            as   : 'TranslatedArticles'
        }
    ]
});

Но когда я запускаю это, я получаю:

SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'translatedArticles.sourceArticleId' in 'where clause'

Я также пробовал варианты именования, включая TranslatedArticles.sourceArticleId, articles.sourceArticleId и articles.sourceArticleId.

Я что-то пропустил?

Обратите внимание, что я временно обойти эту проблему, используя запрос буквального NOT EXISTS, например:

Article.findOne({
    where: Sequelize.literal('NOT EXISTS (SELECT id FROM Articles WHERE Article.id = Articles.sourceArticleId LIMIT 1)')
});
4b9b3361

Ответ 1

Я не знаю, какую технологию баз данных вы используете на бэкэнд, но я предполагаю, что она чувствительна к регистру. Я считаю, что это не поиск поля, потому что вам нужно загладить t в translArticles. Это должно работать:

Article.findOne({
    where: Sequelize.literal('TranslatedArticles.sourceArticleId IS NULL'),
    include: [
        {
            model: Article,
            as   : 'TranslatedArticles'
        }
    ]
});

Ответ 2

Я ухожу от головы, но думаю, что так оно и есть:

Article.findOne({
    include: [
        {
            model: Article,
            as   : 'TranslatedArticles',
            attributes: [[models.sequelize.fn('COUNT', 'sourceArticleId'), 'translationCount']]
            having: {
                translationCount: 0
            },
        }
    ]
});