node.js - node - Secuela donde NO ha
crud node.js mysql (2)
Tengo un modelo de Article
Sequelize donde los artículos se relacionan entre sí. Algunos artículos son copias traducidas de otros artículos. La relación se configura así:
var Article = sequelize.define(''Article'', {
type : DataTypes.ENUM(''source'', ''translated''),
sourceArticleId : DataTypes.INTEGER
});
db.Article.hasMany(db.Article, {
foreignKey: ''sourceArticleId'',
as : ''TranslatedArticles''
});
Por lo tanto, un artículo con type = ''source''
puede tener muchos artículos translatedArticles
donde type = ''translated''
.
Ahora, quiero consultar todos los artículos de source
que no tienen una traducción.
Basado en un problema en el github del proyecto Sequelize , esto se lograría así:
Article.findOne({
where: Sequelize.literal(''translatedArticles.sourceArticleId IS NULL''),
include: [
{
model: Article,
as : ''TranslatedArticles''
}
]
});
Sin embargo, cuando ejecuto esto obtengo:
SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column ''translatedArticles.sourceArticleId'' in ''where clause''
También he intentado variaciones en la denominación, incluyendo TranslatedArticles.sourceArticleId
, articles.sourceArticleId
, y Articles.sourceArticleId
.
¿Me estoy perdiendo de algo?
Tenga en cuenta que resuelvo temporalmente este problema utilizando una consulta literal NO EXISTA, así:
Article.findOne({
where: Sequelize.literal(''NOT EXISTS (SELECT id FROM Articles WHERE Article.id = Articles.sourceArticleId LIMIT 1)'')
});
Me estoy volviendo loco, pero creo que así es como se logra:
Article.findOne({
include: [
{
model: Article,
as : ''TranslatedArticles'',
attributes: [[models.sequelize.fn(''COUNT'', ''sourceArticleId''), ''translationCount'']]
having: {
translationCount: 0
},
}
]
});
No sé qué tecnología de base de datos está utilizando en el backend, pero supongo que distingue entre mayúsculas y minúsculas. Creo que no está encontrando el campo porque necesita capitalizar la t en los artículos traducidos. Esto debería funcionar:
Article.findOne({
where: Sequelize.literal(''TranslatedArticles.sourceArticleId IS NULL''),
include: [
{
model: Article,
as : ''TranslatedArticles''
}
]
});