2015-07-14 19 views
28

Tôi có một mô hình Chuỗi Article trong đó các bài viết liên quan đến nhau. Một số bài báo được dịch các bản sao của các bài viết khác. Mối quan hệ được thiết lập như sau:Phân tích lại vị trí mà không có

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

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

Vì vậy, một bài viết với type = 'source' có thể có nhiều translatedArticles nơi type = 'translated'.

Bây giờ, tôi muốn truy vấn tất cả source các bài viết không có bản dịch.

Dựa trên an issue at the Sequelize project github, điều này sẽ được thực hiện như sau:

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

Tuy nhiên, khi tôi chạy này, tôi nhận được:

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

Tôi cũng đã cố gắng thay đổi trong cách đặt tên, trong đó có TranslatedArticles.sourceArticleId , articles.sourceArticleIdArticles.sourceArticleId.

Tôi có thiếu gì đó không?

Lưu ý rằng tôi tạm thời làm việc xung quanh vấn đề này bằng cách sử dụng một chữ NOT EXISTS truy vấn, như vậy:

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

Bạn sử dụng phiên bản nào? – yanana

+0

@yanana phiên bản 3.3.1 – Tom

+0

Bạn có thể bật nhật ký SQL và xem những gì mà trình tạo truy vấn tiếp theo đang cố truy vấn không? –

Trả lời

0

Tôi sẽ ra khỏi đỉnh đầu của tôi ở đây, nhưng tôi nghĩ đây là cách nó là đạt được:

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

Điều này không trả lại bất kỳ bài viết nào vì không có gì phù hợp với tuyên ngôn ở bên trong. – Tom

+0

Có thể bản sửa đổi đó gần hơn với câu trả lời không? – swifty

+0

điều này trả về 'SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Cột không xác định 'TranslatedArticles.translationCount' trong 'where clause'' với SQL được tạo https://gist.github.com/tommedema/66e8ae5b715b31c337a9 – Tom

3

Tôi không biết bạn đang sử dụng công nghệ cơ sở dữ liệu nào trên chương trình phụ trợ nhưng tôi đoán nó có phân biệt chữ hoa chữ thường. Tôi tin rằng nó không phải là tìm kiếm các lĩnh vực bởi vì bạn cần phải tận dụng t trong translationArticles. Điều này sẽ hoạt động:

Article.findOne({ 
    where: Sequelize.literal('TranslatedArticles.sourceArticleId IS NULL'), 
    include: [ 
     { 
      model: Article, 
      as : 'TranslatedArticles' 
     } 
    ] 
}); 
Các vấn đề liên quan