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 translatedArticles
où type = '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)')
});
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'
}
]
});
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
},
}
]
});