web-dev-qa-db-fra.com

Sequelize où n'a PAS

J'ai un modèle Article Sequelize où les articles sont liés les uns aux autres. Certains articles sont des copies traduites d’autres articles. La relation est configurée comme suit:

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

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

Ainsi, un article avec type = 'source' peut avoir plusieurs translatedArticlestype = 'translated'.

Maintenant, je veux interroger tous les articles source qui n'ont pas de traduction.

Basé sur un problème du github du projet Sequelize , cela serait accompli comme suit:

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

Pourtant, lorsque je lance ceci, je reçois:

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

J'ai également essayé différentes variantes de nommage, notamment TranslatedArticles.sourceArticleId, articles.sourceArticleId et Articles.sourceArticleId.

Est-ce que je manque quelque chose?

Notez que je contourne temporairement ce problème en utilisant une requête NOT EXISTS littérale, comme ceci:

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

Je ne sais pas quelle technologie de base de données vous utilisez sur le backend, mais je suppose qu'elle est sensible à la casse. Je crois que ce n'est pas trouver le terrain parce que vous devez capitaliser le t dans translationsArticles. Cela devrait fonctionner:

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

Je me trompe, mais je pense que c’est comme ça que l’on a réussi:

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