2015-07-14 7 views
28

Mam Article Sequelize model, gdzie artykuły odnoszą się do siebie. Niektóre artykuły są przetłumaczonymi kopiami innych artykułów. Relacja jest ustawiony tak:Sequelize gdzie NIE

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

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

Tak, artykuł z type = 'source' może mieć wiele translatedArticles gdzie type = 'translated'.

Teraz chcę zapytać wszystkie artykuły source, które nie mają tłumaczenia.

podstawie an issue at the Sequelize project github, to będzie realizowane tak:

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

Jednak gdy uruchamiam to uzyskać:

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

Próbowałem również różnice w nazewnictwa, w tym TranslatedArticles.sourceArticleId , articles.sourceArticleId i Articles.sourceArticleId.

Czy brakuje mi czegoś?

pamiętać, że tymczasowo obejść ten problem za pomocą dosłownym NIE ISTNIEJE zapytanie, tak jak poniżej:

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

Którą wersję używasz? – yanana

+0

@yanana wersja 3.3.1 – Tom

+0

Czy można włączyć dziennik SQL i zobaczyć, co kwerenda wyszukiwania sequelize próbuje zapytanie? –

Odpowiedz

0

mam zamiar wyłączyć mojej głowie tutaj, ale myślę, że to jest jak jest Osiągnięto:

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

To nie jest zwracanie żadnych artykułów, ponieważ nic nie pasuje do wewnętrznej instrukcji where. – Tom

+0

Czy ta wersja może być bliższa odpowiedzi? – swifty

+0

to zwraca 'SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Nieznana kolumna 'TranslatedArticles.translationCount' w 'where clause'' z wygenerowanym SQL https://gist.github.com/tommedema/66e8ae5b715b31c337a9 – Tom

3

Nie wiem, jakiej technologii baz danych używasz na zapleczu, ale domyślam się, że rozróżniana jest wielkość liter. Uważam, że nie znajduje pola, ponieważ musisz użyć t w przetłumaczonych artykułach. Powinno to zadziałać:

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