2015-07-14 15 views
28

Ho un modello Sequelize Article in cui gli articoli si correlano tra loro. Alcuni articoli sono copie tradotte di altri articoli. La relazione è messa a punto in questo modo:Sequenza dove NON è stato impostato

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

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

Così, un articolo con type = 'source' può avere molti translatedArticles dove type = 'translated'.

Ora, desidero interrogare tutti gli articoli source che non hanno una traduzione.

Sulla base di an issue at the Sequelize project github, questa sarebbe stata compiuta in questo modo:

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

Eppure, quando faccio funzionare questo ottengo:

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

Ho anche provato le variazioni nella denominazione, tra cui TranslatedArticles.sourceArticleId , articles.sourceArticleId e Articles.sourceArticleId.

Mi manca qualcosa?

Nota che temporaneamente aggirare il problema utilizzando un letterale NON ESISTE interrogazione, in questo modo:

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

Quale versione usi? – yanana

+0

@yanana versione 3.3.1 – Tom

+0

È possibile attivare il registro SQL e vedere per che cosa il query del generatore di sequelize sta tentando di eseguire una query? –

risposta

0

sto andando fuori dalla parte superiore della mia testa qui, ma credo che questo sia come sia il risultato:

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

Questo non restituisce alcun articolo, perché nulla corrisponde all'istruzione inner where. – Tom

+0

Potrebbe la revisione essere più vicina alla risposta? – swifty

+0

restituisce 'SequelizeDatabaseError: ER_BAD_FIELD_ERROR: colonna sconosciuta 'TranslatedArticles.translationCount' in 'where clause'' con SQL generato https://gist.github.com/tommedema/66e8ae5b715b31c337a9 – Tom

3

Non so quale tecnologia di database si sta utilizzando sul back-end, ma credo che sia case-sensitive. Credo che non stia trovando il campo perché è necessario capitalizzare la t in translationArticles. Questo dovrebbe funzionare:

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